multer:动态目标路径

Zeo*_*kav 10 node.js multer

我正在编写一个节点应用程序,我正在寻找可以在服务器上上传文件的东西。当只有一个静态目录时,我可以上传文件。但是我需要为每个用户创建目录,然后根据登录的用户将文件上传到这些目录。我查找了一些东西,但我尝试的所有内容都以错误结尾:ENOENT:没有这样的文件或目录,打开...错误. 我目前正在尝试做的是 -

let storage = multer.diskStorage({
  destination: function(req, file, cb) {
    let dest = path.join(__dirname, './documents', 'somenameigetfromtheuser');
    let stat = null;
    try {
      stat = fs.statSync(dest);
    }
    catch (err) {
      fs.mkdirSync(dest);
    }
    if (stat && !stat.isDirectory()) {
      throw new Error('Directory cannot be created');
    } 
    cb(null, dest);
  }
});

let upload = multer({
  storage: storage,
  dest: 'documents/'
});

app.post('/testUpload', upload.single('testfile'), (req, res) => {
  res.json({
    test: 'test'
  })
});
Run Code Online (Sandbox Code Playgroud)

已经回答了一个类似的问题,但它对我来说不起作用,因为我想要请求对象中的目录名称。

当我在 multer 初始化中删除 storage 属性时,文件以随机名称存储在文档目录中。我希望文件具有其原始名称,并且希望将其存储在从 req 对象获取目录名称的目录中。
帮兄弟解决一下,谢谢!

Muh*_*zad 6

这是按参数动态路径的代码!

exports.upload = (folderName) => {
  return imageUpload = multer({
    storage: multer.diskStorage({
      destination: function (req, file, cb) {
        const path = `src/assets/uploads/${folderName}/`;
        fs.mkdirSync(path, { recursive: true })
        cb(null, path);
      },

      // By default, multer removes file extensions so let's add them back
      filename: function (req, file, cb) {
        cb(null, Date.now() + path.extname(file.originalname));
      }
    }),
    limits: { fileSize: 10000000 },
    fileFilter: function (req, file, cb) {
      if (!file.originalname.match(/\.(jpg|JPG|webp|jpeg|JPEG|png|PNG|gif|GIF|jfif|JFIF)$/)) {
        req.fileValidationError = 'Only image files are allowed!';
        return cb(null, false);
      }
      cb(null, true);
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

并称之为 在此输入图像描述


Łuk*_*asz 5

已编辑

https://github.com/expressjs/multer#diskstorage

请注意, req.body 可能尚未完全填充。这取决于客户端向服务器传输字段和文件的顺序。

因此,首先在临时目录中写入文件,从 req 中读取目录名并移动文件:

fs = require('fs-extra'); //npm install fs.extra
...

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) {
        cb(null, '../tempDir/')
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname)
    }
});

var upload = multer({ 
    storage: storage
}).single('file');

upload(req, res, function (err) {
    if (err) {
        res.json({});
        return;
    }

    var dir = JSON.parse(req.body.data).directory;
    var filename = req.file.filename;

    fs.move('../tempDir/' + fileName, '../tempDir/' + dir + '/' + fileName, function (err) {
        if (err) {
            return console.error(err);
        }

        res.json({});
    });

});
Run Code Online (Sandbox Code Playgroud)


YLS*_*YLS 1

在我的项目中,我使用 multer 如下:

1.首先将文件存储在公共目录中,例如/tmp/。

2.将文件复制/移动到您想要的任何位置,在我的情况下复制/移动到 CDN,在您的情况下复制到用户文件夹。

3.如果需要,删除/tmp 中的原始文件。

也许let upload = multer({ storage: storage, dest: 'documents/' });您应该删除此处的 dest,因为您在存储中指定了 dest,对吗?