يتم تنزيل ملفات الوسائط غير المرئية المخزنة محليًا أو التي تم نقلها إلى S3 باستخدام rake uploads:migrate_to_s3 بأسماء الملفات الأصلية عند النقر على رابط التحميل، بينما تفتح ملفات الوسائط غير المرئية المرفوعة مباشرةً إلى S3 في علامة تبويب جديدة ويُفقد اسم الملف الأصلي.
يُعدّل أمر rake uploads:migrate_to_s3 خاصية content_disposition لجميع التحميلات غير المرئية
بينما يُعدّل الرفع إلى S3 خاصية content_disposition لجميع التحميلات غير الوسائطفقط
الحل هو استبدال is_supported_media بـ is_supported_image (تم اختباره ويعمل كما هو متوقع).
عند النظر إلى هذا مرة أخرى، أعتقد أن الحل هو العكس تمامًا — يجب أن تكون المهمة 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، إلخ)
إذا كنت أغفل شيئًا هنا، فلا تتردد في إضافة مزيد من المعلومات أو الأمثلة.
صدّقني، لقد قضيت أيامًا في فهم هذا الأمر، وكان غريبًا بالنسبة لي أيضًا، لكن تعيين 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، يختلف هذا الآن عن الطريقة التي تُقدَّم بها ملفات الوسائط من التخزين المحلي (لا يزال التضمين التلقائي يعمل، لكن روابط التنزيل مع الأسماء الأصلية لم تعد متاحة).
إذا كنت بحاجة إلى أي معلومات إضافية، فالرجاء إخباري.
بصراحة، لم أبحث في هذا الأمر بشكل أعمق بسبب أعمال أخرى ملحة. وقد خصصت بعض الوقت في جدول مواعيدي الآن للنظر في هذا الأمر بشكل صحيح هذا الأسبوع. يبدو التغيير بسيطًا، لذا لا ينبغي أن يستغرق وقتًا طويلاً. سأقوم بالإبلاغ مرة أخرى بمجرد الانتهاء من طلب السحب.
@md-misko لقد أكدت سيناريو الاستخدام الخاص بك، وبعد إصلاح محتوى الترتيب (content-disposition)، ما زلت قادرًا على بث الصوت والفيديو بشكل صحيح. يتم الآن بناء الإصلاح، ومن المتوقع دمجه بحلول نهاية اليوم: