لا يمكن تنزيل ملفات الوسائط غير الصور، وفُقدت أسماء الملفات الأصلية عند رفعها إلى S3

صدّقني، لقد قضيت أيامًا في فهم هذا الأمر، وكان غريبًا بالنسبة لي أيضًا، لكن تعيين content-disposition: attachment; filename=X لجميع ملفات الوسائط ما عدا الصور يحاكي بشكل مثالي الطريقة التي تُقدَّم بها ملفات الوسائط حاليًا من التخزين المحلي.

باختصار، لا! يمكنني بثها باستخدام “oneboxing” إذا لزم الأمر، لكن رابط التنزيل المباشر [media_file](path_to_media_file)—حيث يكون المسار إما محليًا أو على S3—يجب أن ينزّل الملف باستخدام اسمه الأصلي تمامًا كما يحدث في التخزين المحلي (وللملفات التي تم نقلها إلى S3).

لكن هذا لم يعد ممكنًا فجأة عند الرفع المباشر إلى S3: رابط [media_file](S3_path_to_media_file) يقوم ببث ملف الوسائط في تبويب جديد (وهو أمر غير مطلوب، لأن هذا ما يفعله “oneboxing”)، وعند محاولة تنزيله من عناصر تحكم مشغل الوسائط يفقد أيضًا اسمه الأصلي.

أتوقع أن الملفات المستضافة محليًا وعلى S3 يجب أن تتصرف بنفس الطريقة، أليس كذلك؟ مع اقتراحك، ستعكس الوظيفة تمامًا للuploads المستضافة على S3، ليس فقط للuploads الجديدة بل للمنتقلة أيضًا.

إليك ملف حالة مفصل، ولماذا أعتقد أن اقتراحي صحيح (أي أنه يحافظ على نفس الوظيفة للuploads المستضافة محليًا وعلى S3):

الملفات المستضافة محليًا

لدي مستودع كبير (أكثر من 5 آلاف) من ملفات الصوت (الكلام) تتراوح بين 1-10 ميجابايت، بإجمالي يقارب 40 جيجابايت، وهي مستضافة حاليًا على التخزين المحلي ويتم نقلها الآن إلى S3 (وهذا عن قصد، لا أريد استضافتها على خدمة طرف ثالث). هذا يعمل بشكل جيد بالفعل من منظور الأداء، لكن الآن أصبح من المنطقي الانتقال إلى S3 بسبب ارتفاع تكاليف التخزين وإمكانية استخدام CDN مع S3.

هذه الملفات مُحسَّنة من حيث الحجم ولا يُقصد بها البث، بل التنزيل والاستماع إليها محليًا (للعملاء الذين لديهم نطاق ترددي محدود/اتصال ضعيف). تُحمَّل الملفات دفعة واحدة ثم تُستشهد بها في المنشور الخام باستخدام روابط مُولَّدة من قيم SHA1 الخاصة بها باستخدام: [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3) ويمكن تنزيلها باستخدام اسمها الأصلي عن طريق النقر على رابط مباشر إلى الملف (انظر المثال هنا).

إذا، من ناحية أخرى، تم تضمين هذه الروابط تلقائيًا (oneboxing)، فيمكن بثها مباشرة من خادم Discourse (وأيضًا تنزيلها من عناصر تحكم المشغل، مرة أخرى بالاسم الأصلي).

الملفات التي تم نقلها إلى S3

عند نقل الuploads من التخزين المحلي إلى S3 باستخدام أمر uploads:migrate_to_s3 يحدث أمران:

  • يتم تعيين content-disposition: attachment; filename=X لجميع الuploads ما عدا الصور
  • يتم استبدال الروابط المحلية المباشرة [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3) في المنشورات الخام بروابط S3 [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3)

هذا يحاكي الuploads المستضافة محليًا بكل طريقة (روابط التنزيل مع الأسماء الأصلية وكذلك التضمين التلقائي).

الملفات المرفوعة حديثًا إلى S3

  • لا يتم تعيين content-disposition: attachment; filename=X لجميع ملفات الوسائط
  • تُستشهد بالملفات المرفوعة حديثًا باستخدام رابط قصير في النص الخام، لكن الروابط المطبوخة لا تزال تشير مباشرة إلى https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3
  • النقر على رابط URL القصير أو رابط S3 المُدخل يدويًا [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3) يفتح الملف في تبويب جديد بدلاً من تنزيله.

بسبب عدم تعيين content-disposition، يختلف هذا الآن عن الطريقة التي تُقدَّم بها ملفات الوسائط من التخزين المحلي (لا يزال التضمين التلقائي يعمل، لكن روابط التنزيل مع الأسماء الأصلية لم تعد متاحة).

إذا كنت بحاجة إلى أي معلومات إضافية، فالرجاء إخباري.

إعجابَين (2)