Multer Express:每个请求使用不同的文件夹

时间:2018-10-17 20:52:16

标签: express blob multer

我正在使用Multer和Express通过Ajax上传放置在Blob中的图像列表。我可以在服务器端接收并保存这些图像。问题是我需要同一Ajax请求的所有图像都在同一文件夹内。我需要一个文件夹。每个文件夹都有随机的uuid名称。

问题在于每个图像都位于不同的文件夹中。也许问题是因为我将图像发送到Blob中?您有解决此问题的想法吗?非常感谢,这是我对multer的配置:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    let path = './public/images/' + uuidv4() + '/'; //a different folder for each request
    file.path = path;
    fs.mkdirSync(path);
    cb(null, path);
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '.' + mime.extension(file.mimetype));
  }
})
let upload = multer({ storage: storage });

1 个答案:

答案 0 :(得分:2)

问题是为请求的每个图像运行destination函数,这将每次创建一个不同的UUID,从而为每个图像创建一个新文件夹。

您需要预先将UUID存储在req中,以便可以在destination函数中使用它。这将为每个请求创建一个唯一的目录。

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    let path = './public/images/' + req.imagesFolder + '/';
    file.path = path;
    fs.mkdirSync(path);
    cb(null, path);
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '.' + mime.extension(file.mimetype));
  }
})
const upload = multer({ storage: storage });

而且,在使用中间件时:

const preuploadMiddleware = (req, res, next) => {
  req.imagesFolder = uuidv4();
  next();
};

app.post('/images', preuploadMiddleware, upload, (req res, next) => {
  // ...
});