پرش به مطلب اصلی

File Uploading

در این داکیومنت در رابطه با کتابخونه‌های مختلف برای آپلود فایل صحبت میکنیم

Multer​

روش پیشنهادی خود express.js برای آپلود فایل ها هست

کار باهاش خیلی خیلی راحت هست

Installation​

npm install multer --save

Single File Upload​

برای شروع کار با multer باید ابتدا مسیری که میخواهیم داخلش فایل آپلود بشه رو مشخص کنیم و به برنامه بدیم

سپس تعین کنیم اسم کلیدی که هنگام آپلود در form-data ارسال میکنیم چیست

const multer = require("multer");

const uploadFile = multer({ dest: "uploads" }); // فولدر ذخیره سازی فایل ها

app.post("/api/upload", uploadFile.single("upload"), (req, res) => {
res.json(req.file);
});

درواقع در این روش گفته شده که در form-data ارسال شده فایل مدنظر با کلید upload باید ارسال شود و از طرفی فایل های آپلود شده در دایرکتوری uploads ذخیره میشود

برای مسیر دهی بهتر میتونیم از ماژول path هم استفاده کنیم :

const uploadFile = multer({ dest: path.join(__dirname, "..", "uploads") });

Array of Files Upload​

برای آپلود چند فایل صرفا باید از array به جای single استفاده کرد

یعنی به فرمت زیر باشد :

uploadFile.array("upload", count);

count حداکثر تعداد فایل‌های قابل آپلود را تعیین میکند

مثال :​

const multer = require("multer");

const uploadFile = multer({ dest: "uploads" });

app.post("/api/upload", uploadFile.array("upload", 3), (req, res) => {
res.json(req.file);
});

Multer Config​

ما میتونیم برای مولتر کانفیگ ست بکنیم که با چه اسمی ذخیره بکنه، حداکثر سایزش چقدر باشه، با توجه به هر فایل در کدام مسیر ذخیره بکنه و ....

در اینجا یک مثال ساده از کانفیگش آوردیم :

multer.middleware.js
const multer = require("multer");
const path = require("path");
const fs = require("fs");

const multerStorage = multer.diskStorage({
destination: (req, file, cb) => {
// هرچیزی که توسط cb کال بشه اونجا فایل ذخیره میشود

if (!fs.existsSync("uploads")) fs.mkdirSync("uploads");
cb(null, "uploads"); // cb(error, destination)
},
filename: (req, file, cb) => {
// هرچزیزی که توسط cb کال شود اسم فایل قرار میگیرد

const basename = path.basename(file.originalname);
cb(null, basename);
},
});

const uploadFile = multer({
storage: multerStorage,
limits: {
fieldSize: 1 * 1000 * 1000, // 1e6 Byte = 1MB
},
});

module.exports = uploadFile;

در این کانفیگ دو مقدار destination و filename ذکر شده که هر مقداری توسط cb(error, value) در بخش value کال شود ذخیره میشود

و نحوه‌ی استفاده از آن تفاوتی نمیکند

const uploadFile = require("./middlewares/multer.middleware.js");

app.post("/api/upload", uploadFile.array("upload", 3), (req, res) => {
res.json(req.files);
});
اطلاع

اگر چند فایل آپلود میشود توسط req.files به آنها میتوان دسترسی داشت و اگر یک فایل است توسط req.file میتوان به آن دسترسی داشت

Make Directory Static​

بعد از آپلود فایل در یک دایرکتوری باید به آن دسترسی داشته باشیم.

که توسط میدلور express.static این امر قابل پیاده سازی هست

app.use(express.static("uploads"));

در این حالت دایرکتوری uploads رو به عنوان استاتیک و قابل دسترس تعریف میکنه


هشدار

بعد از استاتیک کردن یک فولدر نیاز به وارد کردن اسم فولدر توی url-ای که سرچ میکنیم نیست

برای مثال اگر داخل دایرکتوری uploads یک فایل به اسم img.png باشد برای دسترسی به آن باید مسیر زیر رو زد

/uploads/img.png/
http://localhost:8000/img.png

و نیاز به وارد کردن uploads در مسیر نیست

Multiple Fileds Upload​

تفاوت این فیلد با بخشArray of Files Upload این هست که در اون بخش ما یک آرایه با کلید یکسان ارسال میکردیم اما در این بخش میتونیم بای کلیدهای متفاوت ارسال کنیم

در این حالت باید از uploadFile.fileds([]) استفاده کنیم که هر فیلد را مشخص کنیم

برای مثال یک آرایه از فایل‌ها با کلید upload و حداکثر ۳ فایل و یک فایل با کلید image و یکسری داکیومنت با کلید documents و حداکثر ۶ داکیومنت ارسال کنیم :

app.post(
"/api/upload",
uploadFile.fields([
{
name: "upload",
maxCount: 3,
},
{
name: "image",
maxCount: 1,
},
{
name: "documents",
maxCount: 6,
},
]),
(req, res) => {
res.json(req.files);
},
);

Any File Upload​

در این متد میگوییم فرقی نمیکند چه فایلی و با چه نوعی ارسال شود. هرفایلی را با هر کلید فیلدی قبول میکند

که باید از uploadFile.any() به عنوان میدلور استفاده کرد

app.post("/api/upload", uploadFile.any(), (req, res) => {
res.json(req.files);
});

None File Upload​

در این متد هیچ فایلی حق آپلود کردن ندارد

که باید از uploadFile.none() به عنوان میدلور استفاده کرد

app.post("/api/upload", uploadFile.none(), (req, res) => {
res.json(req.files);
});