شكراً على الرد السريع يا @martin.
نعم، نحن نستضيف معكم. إذن، ما يحدث عادةً عندما تسحب ملفًا إلى المنشئ هو أنه يُدخل بعض النصوص في المنشئ مثل “جارٍ معالجة <اسم الملف>”… أيضًا، في حالة استخدام API.addComposerUploadHandler([“mp4”, “mov”, “mkv”, “avi”, “m4v”])، يتم ذلك بواسطة Discourse قبل تسليم الملف إلى المعالج المخصص هنا. توقف إدخال نص العنصر النائب هذا عن العمل في وقت ما، وهو الوقت الذي أدخلت فيه الكود بنفسي في المعالج الخاص بي:
composerController.model.appEvents.trigger("composer:insert-block", `[جارٍ معالجة: ${file.name}...]()`);
الشيء التالي الذي تعطل هو أن المعالج الخاص بنا لم يبدأ العمل لأن امتدادات الفيديو هذه اختفت فجأة من إعداد “الامتدادات المصرح بها للموضوع” - أو كان عليّ إعادة إضافتها هناك لكي تبدأ الأمور في العمل مرة أخرى.
ثم اكتشفت مشكلة إسقاط الملفات “المتعددة” كما هو موضح سابقًا.
لقد نجحنا في ذلك بطريقة تمكنت فيها من إسقاط ملفين أو أكثر دون ظهور رسائل خطأ. وشعرت أيضًا أنها صحيحة لأننا كنا نتجاوز كل منطق التحقق من صحة Discourse.
إليك مقتطفات الكود ذات الصلة:
هنا أتوقع ببساطة أن يقوم Discourse بتسليم الملفات إليّ. واحدًا تلو الآخر.
// تسجيل معالج تحميل مخصص لمقاطع الفيديو.
api.addComposerUploadHandler(["mp4", "mov", "mkv", "avi", "m4v"], (file, editor) => {
console.log("جارٍ معالجة التحميل لـ", file.name);
sendToGDrive(file, api);
})
نظرًا لأن Discourse سلم لنا الملفات بشكل فردي، فقد أنشأت دالة وسيطة تقوم ببساطة بملء مصفوفة وبعد فترة زمنية تبدأ دالة التحميل الفعلية. لذا، أقوم بجمع الملف الذي تم تمريره من Discourse في مصفوفتي الخاصة.
// جمع كل الملفات التي تم إسقاطها بالتتابع - كما تم الإبلاغ عنها بواسطة معالج Discourse.
function sendToGDrive(file, api) {
clearTimeout(uploaderStartTimeout);
filesHolder.push(file)
const composerController = api.container.lookup("controller:composer");
composerController.model.appEvents.trigger("composer:insert-block", `[جارٍ معالجة: ${file.name}...]()`);
uploaderStartTimeout = setTimeout(function () {
initFileSend(api);
}, 300);
}
ثم أقوم بتحميل كل ملف بشكل فردي إلى Gdrive.
// معالجة كل ملف بشكل فردي.
async function initFileSend(api) {
for (const file of filesHolder) {
const content = await sendFileToGdrive(file, api, uploadFolderId);
}
}
المشاكل الملاحظة:
- إسقاط “ملفات متعددة” يسبب التحقق من حجم الملف بينما لا تفعل إسقاطات الملفات الفردية