رفع الملفات هي عملية أساسية في أي تطبيق إنترنت، وللأسف فإن النسخة 0.4 من إطار Express لاتدعم رفع الملفات لأنها لاتتعامل مع نماذج multipart/form-data ولكن توجد مكتبات إضافية تستطيع إستخدامها مثل multiparty أو busboy وسوف أقوم بإستعراض كيفية ذلك بإستخدام وحدة multiparty.

لنفترض أن لديك مجلد nup قم بفتح المجلد عن طريق سطر الاوامر ونفذ الأمرين التاليين لتنزيل كل من express و multiparty:

npm install express
npm install multiparty

بعد ذلك قم بإنشاء مجلد public وداخل هذا المجلد قم بإنشاء مجلد upload.

/nup
    /public
        /upload
    /node_modules
    app.js

والآن لنلقي نظرة على الشفرة:

var express = require('express');
var fs = require('fs');
var mp = require('multiparty');


app = express();
app.use(express.static(__dirname + '/public'));




app.route('/')
.post(function(req,res,next){

  var form = new mp.Form();

  form.on('file', function(name, file){


    if(file.originalFilename != "") //make sure that we didn't get an empty file
    {
        //open the file in the TEMP upload folder and write the file to the original upload one
        fs.readFile(file.path , function(err ,data){

            fs.writeFile(__dirname+'/public/upload/'+file.originalFilename, data, function(err){

                if(err)
                {
                    console.log('error writing the file to the upload folder');
                }
                else
                {
                    console.log(__dirname+'/public/upload/'+file.originalFilename+' uploaded successfully');
                    fs.unlink(file.path); //delete the temp file as we no longer need it
                }

            });

        });

    }
    else
    {
        fs.unlink(file.path); //delete the temporary file that was created by the upload
    }


  });


  form.on('close', function(){

    res.send('DONE :)');

  });

  form.parse(req , function(err, fields, files){

    if(err)
        console.log(err);


  });






})
.all(function(req,res,next){


    res.end('<html><body><form method="post" action="/" enctype="multipart/form-data"><input type="file" name="image"/><input type="submit"/></form></body></html>');

});

app.listen(8080,function(){

    console.log('started listening');

});

قمت بتعيين المسار الأساسي "/" بإستخدام Express ومن ثم نحدد التعامل مع كل طلب فلو كان الطلب عبارة عن post فذلك سوف يقوم بإستقبال الملف والتعامل معه بواسطة multiparty ولو تلاحظ ستجد أننا أنشأنا عنصر Form ومن ثم قم بتحديد الأحداث التي يتعامل معها:

الحدث "File" والذي سوف يتم إستدعائه على كل ملف يأتي في الطلب وسوف يقوم النظام مبدئياً بتخزين الملف في مسار مؤقت ومل ما أقوم به هو التأكد من أن الملف المرسل صحيح ومن ثم نقله إلى المسار الجديد وحذف الملف المؤقت.

الحدث "End" وسيتم إستدعائه حين يتم الإنتهاء من معالجة كل الملفات المرسلة.

بعد أن قمنا بتعريف الاحداث نقوم بتمرير البيانات المرسلة عبر :

form.parse(req , function(err, fields, files){

    if(err)
        console.log(err);


  });

ماسبق يحدث تحت قسم post في المسار (route) ولكن لو كان الطلب غير الـ post فسوف نقوم بعرض نموذج HTML بشكل عادي:

.all(function(req,res,next){
    res.end('<html><body><form method="post" action="/" enctype="multipart/form-data"><input type="file" name="image"/><input type="submit"/></form></body></html>');

});

طبعا الأسطر الأخيرة هي من يقوم بتشغيل البرنامج والإستماع على المنفذ 8080، لذلك بعد أن تقوم بحفظ الملف بإسم app.js قم بتنفيذه عبر:

node app.js

وتوجه إلى localhost:8080 لتجربة البرنامج.

المزيد من المراجع:

http://nodejs.org/api/fs.ht...