如何设置connect-multiparty上传文件的名称?

Abh*_*shi 6 javascript node.js express

我有一个页面,我想接受一个文件和3-4个用户输入,我能够使用connect-multiparty中间件实现这一点,但上传文件的名称是一些乱码,正确的扩展和上传的文件内容也是正确.

我想要实现以下目标

  1. 设置要上载的文件的名称
  2. 如果目标目录中存在同名文件,则创建具有不同名称的文件副本
  3. 设置大小的最大限制并限制文件类型.

我在网上搜索但找不到任何有效的例子.我的完整代码如下

var express = require('express');
var router = express.Router();
var fs = require('fs');
var multiparty = require('connect-multiparty');
var multipartyMiddleware = multiparty({
    uploadDir : '../public/uploads'
});

router.post('/api/user/uploads', multipartyMiddleware, function(req, res) {

    var file = req.files.file;
    console.log(file.name);
    console.log(file.type);
    console.log(file);
    console.log(req.body.test);

    console.log("The file was saved!");
    res.json({
        success : 1
    });
    return;

});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

Edu*_*djr 0

复制后您必须使用 重命名该文件fs.rename(),或者修改node_modules 内的multiparty 源代码。在他们的代码中,他们有一个执行重命名的函数:

function uploadPath(baseDir, filename) {
  var ext = path.extname(filename).replace(FILE_EXT_RE, '$1');
  var name = randoString(18) + ext;
  return path.join(baseDir, name);
}
Run Code Online (Sandbox Code Playgroud)

我对他们的代码做了一些修改,这样我就可以像 multer 一样使用它:

https://gist.github.com/Edudjr/999c80df952458cc583272a5161b4d08

你会像这样使用它:

var EXT_RE = /(\.[_\-a-zA-Z0-9]{0,16}).*/g;
var options = {
    uploadDir : path.join(__dirname,'../public/images'),
    filename: function(filename, callback){
     var name = filename.replace(EXT_RE, "");
     callback(name+'-YEAH.png');
   }
}
var form = new multiparty.Form(options);
Run Code Online (Sandbox Code Playgroud)

他们强烈建议您将文件保存在临时文件夹中,以防止服务器上出现 DoS。

https://github.com/pillarjs/multiparty/issues/64