Как автоматически создать папку перед загрузкой файлов через multer, чтобы эти файлы сохранялись в этой созданной папке в nodejs?

#node.js #file-upload #multer #create-directory

#node.js #загрузка файла #мультер #создать-каталог

Вопрос:

Это мой код multer для загрузки нескольких файлов.

 var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './public/files/'  req.user.id)
  },
  filename: function (req, file, cb) {
    x = file.originalname; // path.extname(file.originalname);
  cb(null,x);
  }
});

var upload = multer({storage: storage});
  

Это запрос post, в котором файлы отправляются при нажатии кнопки отправки.

 router.post(upload.array("FileUpload",12), function(req, res, next) {

//Here accessing the body datas.

})
  

Итак, чего я хочу, я хочу сначала создать folder с именем ID сгенерированного, к которому можно получить доступ из req.body , а затем загрузить эти файлы в эту папку соответственно.
Но поскольку я не могу получить доступ к body первому перед загрузкой, я не могу создать соответствующее folder directory. , есть ли какой-либо другой способ, который я могу придумать и реализовать?

Обновлено решение с использованием пакета fs-extra.

 const multer = require('multer');
let fs = require('fs-extra');

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    let Id = req.body.id;
    fs.mkdirsSync('./public/files/'  req.user.id   '/'   Id);
    cb(null, './public/files/'  req.user.id   '/'   Id)
  },
  filename: function (req, file, cb) {
    x = file.originalname; // path.extname(file.originalname);
  cb(null,x);
  }
});

var upload = multer({storage: storage});
  

Это запрос post, в котором файлы отправляются при нажатии кнопки отправки.

 router.post(upload.array("FileUpload",12), function(req, res, next) {

//Here accessing the body datas.

})
  

Ответ №1:

сначала вы должны установить fs-extra тот, который создаст папку

создайте отдельную папку для multer, например multerHelper.js

 const multer = require('multer');
let fs = require('fs-extra');

let storage = multer.diskStorage({
destination: function (req, file, cb) {
    let Id = req.body.id;
    let path = `tmp/daily_gasoline_report/${Id}`;
    fs.mkdirsSync(path);
    cb(null, path);
},
filename: function (req, file, cb) {
    // console.log(file);

    let extArray = file.mimetype.split("/");
    let extension = extArray[extArray.length - 1];
    cb(null, file.fieldname   '-'   Date.now()   "."   extension);
 }
})

let upload = multer({ storage: storage });

let createUserImage = upload.array('images', 100);

let multerHelper = {
    createUserImage,
}

module.exports = multerHelper;
  

в ваших маршрутах импортируйте файл multerhelper

 const multerHelper = require("../helpers/multer_helper");

router.post(multerHelper , function(req, res, next) {

//Here accessing the body datas.

})
  

Комментарии:

1. Где найти помощников / multer_helper?

2. вы должны создать его в папке вашего проекта

3. Я обновил решение в соответствии с вашим ответом. Это правильно? Пожалуйста, проверьте после добавления «Обновленного решения с использованием пакета fs-extra» в мой вопрос.

4. Я также создал отдельную папку для маршрутов, поэтому этот метод сработал для меня

5. Еще не тестировал. Сделает это и сообщит вам, работает ли это. И тогда я обязательно поддержу ваш ответ, спасибо! 🙂