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

يتم تنزيل ملفات الوسائط غير المرئية المخزنة محليًا أو التي تم نقلها إلى S3 باستخدام rake uploads:migrate_to_s3 بأسماء الملفات الأصلية عند النقر على رابط التحميل، بينما تفتح ملفات الوسائط غير المرئية المرفوعة مباشرةً إلى S3 في علامة تبويب جديدة ويُفقد اسم الملف الأصلي.

يُعدّل أمر rake uploads:migrate_to_s3 خاصية content_disposition لجميع التحميلات غير المرئية

بينما يُعدّل الرفع إلى S3 خاصية content_disposition لجميع التحميلات غير الوسائط فقط

الحل هو استبدال is_supported_media بـ is_supported_image (تم اختباره ويعمل كما هو متوقع).

3 إعجابات

هل نحتاج إلى هذا الإصلاح @sam؟

3 إعجابات

ربما @martin، ما رأيك؟ هل هذا التغيير صحيح؟

4 إعجابات

أعتقد أن هذا الإصلاح يبدو صحيحًا — دعني أجربه محليًا على التغييرات المقترحة، وإذا بدا جيدًا سأقدم طلب سحب (PR).

3 إعجابات

عند النظر إلى هذا مرة أخرى، أعتقد أن الحل هو العكس تمامًا — يجب أن تكون المهمة uploads:migrate_to_s3 مشروطة بـ if !FileHelper.is_supported_media?(name). لا معنى لوضع رأس content-disposition: attachment; filename=X على مقاطع الفيديو والصوت. فأنت تقوم ببث هذه الملفات داخل منشور في Discourse، وليس بتنزيلها؟

إذن ما نريده هو:

بدون رأس content-disposition attachment

  • الصور
  • مقاطع الفيديو
  • الصوت

مع رأس content-disposition attachment مع اسم الملف الأصلي

  • جميع المرفقات/التحميلات الأخرى (PDF، TXT، CSV، إلخ)

إذا كنت أغفل شيئًا هنا، فلا تتردد في إضافة مزيد من المعلومات أو الأمثلة.

3 إعجابات

صدّقني، لقد قضيت أيامًا في فهم هذا الأمر، وكان غريبًا بالنسبة لي أيضًا، لكن تعيين 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)

هذا رائع، شكرًا لك على توفير كل هذا السياق الإضافي. سأقوم بتجربة ذلك وسأسعى لرفع طلب سحب (PR) الأسبوع المقبل.

5 إعجابات

هل هناك أي فرصة لأن يُدرج هذا في الإصدار النهائي 2.5 الذي من المفترض أن يصدر قريبًا؟

إعجاب واحد (1)

بصراحة، لم أبحث في هذا الأمر بشكل أعمق بسبب أعمال أخرى ملحة. وقد خصصت بعض الوقت في جدول مواعيدي الآن للنظر في هذا الأمر بشكل صحيح هذا الأسبوع. يبدو التغيير بسيطًا، لذا لا ينبغي أن يستغرق وقتًا طويلاً. سأقوم بالإبلاغ مرة أخرى بمجرد الانتهاء من طلب السحب.

4 إعجابات

@md-misko لقد أكدت سيناريو الاستخدام الخاص بك، وبعد إصلاح محتوى الترتيب (content-disposition)، ما زلت قادرًا على بث الصوت والفيديو بشكل صحيح. يتم الآن بناء الإصلاح، ومن المتوقع دمجه بحلول نهاية اليوم:

شكرًا لك على الصبر!

4 إعجابات

تم إغلاق هذا الموضوع تلقائيًا بعد 3 أيام. لم يعد مسموحًا بإضافة ردود جديدة.