اذهب إلى المحتوى

السؤال

نشر

لقد قمت باستخدام المكتبة multer للتعامل مع الملفات والصور في مشروع node.js ونجحت بالفعل في رفع هذه الملفات إلى الخادم من خلال الكود التالي:

app.post("/images/upload", [upload.single('upload')], controller.uploadImage);


exports.uploadImage = async (req, res) => {
	...
	//يتم هنا حفظ اسم الملف والمسار في قاعدة البيانات
	...
}

ولكن سؤالي هو كيف يمكنني إظهار نسبة التحميل (نسبة مئوية مثلاً) إلى المستخدم؟ ففي حالة الملفات الكبيرة لم أعد أستطع تحديد الوقت المتبقي لاكتمال عملية رفع الملف.

Recommended Posts

  • 1
نشر

يمكن استخدام الحزمة progress-stream وتتطلب تعديل طفيف بالشيفرة لتصبح كاالتالي:

var p = progress()
var upload = multer().single('file')

req.pipe(p)
p.headers = req.headers

p.on('progress', _)
upload(p, res, _)

حيث يتم ربط progress مع مع الملف المراد رفعه.

_________

إن كان العرض مطلوب لدى المستخدم، يمكن عمل متتبع ضمن Front End:

// تجهيز البيانات و الملف للإرسال
var formData = new FormData();
var file = document.getElementById('myFile').files[0];
formData.append('myFile', file);
var xhr = new XMLHttpRequest();

// تجهيز رابط رفع الملف
xhr.open('post', '/urluploadhere', true);

xhr.upload.onprogress = function(e) {
  if (e.lengthComputable) {
    // تحريك المؤشر كلما تم الإنتهاء من جزء من الملف بطول ذلك الجزء
    var percentage = (e.loaded / e.total) * 100;
    console.log(percentage + "%");
  }
};
// معالجة خطأ
xhr.onerror = function(e) {
  console.log('Error');
  console.log(e);
};
// ربط التحميل مع الدالة 
xhr.onload = function() {
  console.log(this.statusText);
};
// الإرسال
xhr.send(formData);

 

  • 1
نشر

يمكنك ببساطة استخدام برمجية وسيطة لتتبع تقدم تحميل الملف.

نحن نستخدم هذه البرمجيات الوسيطة قبل multer's middleware.
من خلال هذه البرامج الوسيطة ، قمنا بتعيين مستمع حدث لكائن req لتتبع تقدم التحميل. ثم ندعو next لاستدعاء البرمجيّة الوسيطة التالية (Multer).

مثال:

const multer = require('multer');
const upload = multer({dest:'./tmp',limits: {fileSize: 4*1024*1024}});

function progress_middleware(req, res, next){
    let progress = 0;
    const file_size = req.headers["content-length"];
    
    // تعيين مستمع الحدث
    req.on("data", (chunk) => {
        progress += chunk.length;
        const percentage = (progress / file_size) * 100;
        // other code ...
    });

    // استدعاء البرمجيات الوسيطة التالية
    next();
}
// إنتظار طلب تحميل الملف
router.post('/upload', progress_middleware, upload.single('upload'), (req,res) => {
 console.log(req.file);
});

 

  • 1
نشر

في الحقيقة الأحسن ان لا تطبق هذا من السيرفر وفقط تقف عند منطق التحميل فقط ال progress يفضل تطبيقه من الواجهة لأنه هناك أشياء مساعدة وأيضا ليس مكلف وسريع في axios مثلا مجهز ب  onUploadProgress وهي ملائمة جدا لهكذا خاصية 

  const [selectedFiles, setSelectedFiles] = useState([])
  const [progress, setProgress] = useState()
  const submitHandler = e => {
    e.preventDefault() 
    let formData = new FormData()
    formData.append("file", selectedFiles[0])
    axiosInstance.post("/upload_file", formData, {
      headers: {
        "Content-Type": "multipart/form-data",
      },
      onUploadProgress: data => {
        //progress تحديث ال 
        setProgress(Math.round((100 * data.loaded) / data.total))
      },
    })
  }

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...