【问题标题】:Express.js and multer: how to know when the files are all uploaded?Express.js 和 multer:如何知道文件何时全部上传?
【发布时间】:2015-06-09 18:02:08
【问题描述】:

我正在使用 Multer 模块进行文件上传。虽然一切正常,但在他们的 github 页面末尾有一条警告,内容如下: "警告:文件上传完成后 req.body 将被完全解析。过早访问 req.body 可能会导致错误。"

这让我很担心。我只是找不到让 .post 中间件知道文件何时上传并且 req.body 可以使用的方法。这是我的代码:

app.js:

app.use(multer({ 
        dest: './uploads/',
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase() + Date.now();
        },
        putSingleFilesInArray: true       
        })
);

上传.js:

router.route('/')
    .get(function(req, res){
        res.render('uploads');
    })
    .post(function(req, res){
        //how to wait here for the file to upload?
    });

虽然我知道 onParseEnd,但我不知道如何实现它,所以我至少有一些关于上传过程完成的信息。

【问题讨论】:

    标签: javascript express multer


    【解决方案1】:

    你可以很容易地知道它,在multer中有一个可用的选项,称为

    • onFileUploadComplete(file, req, res)

    您可以使用它并从此处发送响应。

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

        app.use(multer({
        dest: path.join(__dirname, '../uploads/fullsize'),
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase();
        },
        onFileUploadStart: function (file) {
            console.log(file.name + ' is starting ...');
        },
        onFileUploadComplete: function (file, req, res) {
            console.log(file.name + ' uploading is ended ...');
            console.log("File name : "+ file.name +"\n"+ "FilePath: "+ file.path)
        },
        onError: function (error, next) {
            console.log("File uploading error: => "+error)
            next(error)
        }
        onFileSizeLimit: function (file) {
            console.log('Failed: ', file.originalname +" in path: "+file.path)
            fs.unlink(path.join(__dirname, '../tmpUploads/') + file.path) // delete the partially written file
        }
    
    }));
    

    【讨论】:

    • 这就是我要问的:在我开始使用 body.parse 之前,我如何知道在我的 upload.js 路由(发布)中文件已上传?您发布的代码只是写在控制台中,但我如何在upload.js文件中检查?我在 app.js 中有 multer
    • html页面如何显示文件上传开始、完成、错误的信息?
    【解决方案2】:

    如果我正确理解文档,则警告仅适用于您可以传递给 multer 本身的事件处理程序。当请求到达您的处理程序时,multer 已经完成并且所有文件都已上传。

    例如在您已经使用的rename 事件中存在问题,但此函数实际上接收四个参数fieldname, filename, req, res。这意味着您可以在请求被完全解析之前访问它。

    【讨论】:

      【解决方案3】:

      Multer 是路由器链的一部分。这意味着 express 将首先执行 multer,并且只有在 multer 完成对表单的解析后,它才会继续执行到您的 .post() 处理程序。页面上的警告用于从 multer 回调中访问 req.body,例如 onFileUploadData() 和类似的。因此,执行顺序为:

      • onParseStart
      • onFileUploadStart/onFileUploadData...
      • onFileUploadComplete
      • onParseEnd
      • 你的.post()处理程序

      【讨论】:

      • 嘿@MikiJ 我可以使用 onFileUploadComplete 中的请求将文件移动到其他位置吗?
      【解决方案4】:

      从 2018 年起,onFileUploadComplete(file, req, res) 不再是 multer 的一部分。

      【讨论】:

      猜你喜欢
      • 2018-04-24
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2017-03-01
      • 2015-10-31
      • 2021-04-09
      相关资源
      最近更新 更多