ربما لاحظت خلال الأشهر العديدة الماضية العديد من الالتزامات المتعلقة بالتحميلات في Discourse core. كان هذا جزءًا من جهد شامل داخل core لاستبدال استخدامات jQuery file upload من قاعدة التعليمات البرمجية الخاصة بنا، كجزء من جهد أوسع نطاقًا لاستبدال استخدامات jQuery نفسها من قاعدة التعليمات البرمجية الخاصة بنا. jQuery file uploader هو مشروع قديم جدًا، وكان جزءًا من Discourse core منذ البداية تقريبًا. أعتقد أنني استخدمته طوال حياتي المهنية في مشاريع أخرى أيضًا. لكن حان الوقت لإنهاء استخدام Ol’ Reliable:
لقد استبدلنا jQuery file upload (وسنستبدل قريبًا أيضًا مكتبة أخرى، resumable.js) بمكتبة تسمى Uppy. هذه مكتبة تحميل أحدث بكثير، ويمكن توسيعها بسهولة باستخدام الإضافات وهي قادرة على التعامل مع جميع مسارات العمل المختلفة التي نواجهها. والأهم من ذلك، يتيح لنا ذلك إجراء تحميلات متعددة الأجزاء مباشرة إلى S3 من عميل Discourse، بدلاً من الاضطرار إلى إرسال ملفات كبيرة عبر واجهة برمجة التطبيقات الخاصة بنا.
يستخدم المنشئ الآن Uppy لجميع التحميلات، والعديد من الأماكن الأخرى في التطبيق تستخدمه (تحميلات الصور الرمزية، تحميلات خلفية الملف الشخصي، إلخ). سيتم التخلص من آخر العناصر المعلقة خلال الأسابيع القليلة القادمة. يجب أن يكون هذا تغييرًا غير مرئي إلى حد كبير لمعظم المستخدمين، ولكن مؤلفي المكونات الإضافية ومكونات السمات سيحتاجون إلى إجراء بعض التغييرات.
واجهة برمجة تطبيقات المكونات الإضافية
المعالجات المسبقة
تحتاج جميع المعالجات المسبقة للتحميل الآن إلى كتابتها كـ مكون إضافي لـ Uppy. هذه المكونات الإضافية سهلة الكتابة، وتستخدم سير عمل بسيط قائم على الوعود. يمكن للمعالج المسبق للتحميل تعديل ملف أو إضافة بيانات وصفية إليه قبل أن يقوم Uppy بتحميله إلى S3 أو إلى نقطة النهاية /uploads.json. لدينا بالفعل العديد من المعالجات المسبقة في core يمكنك استخدامها كمرجع عند كتابة المعالجات الخاصة بك:
- discourse/app/assets/javascripts/discourse/app/lib/uppy-checksum-plugin.js at 6662101208089def86ed18a81ac90d1c52670569 · discourse/discourse · GitHub
- discourse/app/assets/javascripts/discourse/app/lib/uppy-media-optimization-plugin.js at 6662101208089def86ed18a81ac90d1c52670569 · discourse/discourse · GitHub
يتم تسجيل المعالجات المسبقة للتحميل للمنشئ عبر api.addComposerUploadPreProcessor باستخدام واجهة برمجة تطبيقات المكونات الإضافية:
معالجات التحميل
لا تتم كتابة معالجات التحميل كمكونات إضافية لـ Uppy؛ لا تزال تعمل كما كانت دائمًا مع تغيير طفيف. الآن عندما يطابق ملف امتدادًا مسجلاً لمعالج تحميل، سيتم إرسال جميع الملفات المطابقة معًا. في السابق، كان يتم إرسال ملف واحد فقط في كل مرة إلى معالج التحميل، ويتم الآن إرسال مصفوفة بدلاً من ذلك:
لن تتم معالجة الملفات التي يعالجها معالج تحميل بشكل أكبر في مسار تحميل Uppy. يتم تشغيل المعالجات المسبقة قبل استدعاء معالجات التحميل.
تحميلات S3 متعددة الأجزاء المباشرة
ذكرت سابقًا أن استخدامنا لـ Uppy يتيح لنا أيضًا إجراء تحميلات متعددة الأجزاء مباشرة إلى S3 من واجهة المستخدم. لتمكين هذه الميزة، تحتاج إلى تعيين إعداد الموقع enable_direct_s3_uploads إلى true.
إذا كنت تستضيف معنا، فقد تم بالفعل تطبيق أذونات S3 ذات الصلة على الحاوية الخاصة بك. ومع ذلك، إذا كنت تستضيف ذاتيًا، فهناك العديد من الأذونات وقواعد CORS التي يجب إعدادها على الحاوية الخاصة بك لكي تعمل هذه الميزة.
بالنسبة لقواعد CORS، تحتاج فقط إلى تشغيل مهمة s3:ensure_cors_rules باستخدام rake s3:ensure_cors_rules. ستضيف القواعد التالية إلى الحاوية الخاصة بك طالما لديك أذونات S3:GetBucketCors و S3:PutBucketCors ممكّنة لأي مفتاح وصول وسري قمت بإعداده لبيانات اعتماد S3 الخاصة بك على مثيل Discourse الخاص بك.
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
بالنسبة للأذونات، ستحتاج إلى تمكين الأذونات التالية لأي مفتاح وصول وسري قمت بإعداده لبيانات اعتماد S3 الخاصة بك على مثيل Discourse الخاص بك.
{
"Sid": "YourSid",
"Effect": "Allow",
"Action": [
"s3:PutObjectVersionAcl",
"s3:PutObjectAcl",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:DeleteObject",
"s3:CreateMultipartUpload",
"s3:CompleteMultipartUpload",
"s3:AbortMultipartUpload"
],
"Resource": [
"YOUR_RESOURCE"
]
}
لقد كانت هذه عملية استغرقت عدة أشهر طويلة ولم ننتهِ بعد! سأنشر في هذا الموضوع عندما نكون على وشك إزالة jQuery file uploader و resumable.js بالكامل من Discourse core. أخبرني إذا كانت لديك أي أسئلة حول ما نشرته هنا!

