5

我正在使用 NodeJs Multer上传文件。当文件用户尝试上传的文件太大时,我需要将响应发送回客户端。问题是onFileSizeLimit只有文件作为参数,我不知道如何向客户端发送响应。我需要做的基本上如下所示:

app.use('/users/gyms/upload-logo', multer({
    // other settings here then:
    onFileSizeLimit: function (file) {
        // but res (response) object is not existing here
        res.json({
            message: "Upload failed",
            status: MARankings.Enums.Status.FILE_TOO_LARGE
            // status: -6
        });
    }
});

res然而,对象剂量存在在那里,我想知道向客户发送某种响应的最佳方式是什么。

4

5 回答 5

4

尝试这个:

app.use('/users/gyms/upload-logo', multer({
    // other settings here then:
    onFileSizeLimit: function (file) {
        // but res (response) object is not existing here
        file.error = {
            message: "Upload failed",
            status: MARankings.Enums.Status.FILE_TOO_LARGE
            // status: -6
        };
    }, onFileUploadComplete: function (file, req, res) {
        if (file.error){
            res.send(file.error);
        }
    }
});
于 2015-03-10T13:24:31.697 回答
1

在这种情况下,最好记住 Multer 本身只是 Express 调用以获取其响应的一个(中间件)函数。

你也许可以试试这个:

app.use('/users/gyms/upload-logo', function(req, res, next) {

    var handler = multer({

        // other settings here then:
        onFileSizeLimit: function (file) {

            // res does exist here now :)
            res.json({
                message: "Upload failed",
                status: MARankings.Enums.Status.FILE_TOO_LARGE
                // status: -6
            });

        }

    });

    handler(req, res, next);

});

这基本上将 multer 别名为处理程序,从 Express 回调传递,并且意味着您可以从 Multer 的配置中req, res, next访问变量。req, res, next

我没有测试过这个,但我认为这个理论是合理的!

于 2015-03-10T13:19:30.003 回答
1

这是 multer 的作者尚未解决的问题。这个 github issue有很多关于它的讨论:

于 2015-07-02T04:50:19.133 回答
1

我在当前项目中使用了一项工作

文件:make-middleware.js 在此函数末尾更改“function done(err)”

替换第 52 行:onFinished(req, function () { next(err) })

与:第 52 行:onFinished(req, function () { if(err.code == 'LIMIT_FILE_SIZE') { req.fileSizeError = 1; next() } else next(err) })

在应用程序文件中,您可以将代码更改为

app.post('/upload', upload.single('upload'), function (req, res, next) {
    if(typeof req.fileSizeError != "undefined") {
        res.send({"error":"File too large"});// to display filesize error
    } else {
        res.send({"file":req.file}); // when file uploaded successfully
    }
}); 
于 2016-02-13T09:06:24.863 回答
0

multer 文件对象实际上包含一个属性,指示文件是否超出大小限制。见https://www.npmjs.com/package/multer#multer-file-object

为了只接受一个最大大小为 2 MB 且名称为“数据”的文件,我做了这样的事情:

app.use(multer({
    dest: "./uploads/",
    putSingleFilesInArray: true, // see https://www.npmjs.com/package/multer#putsinglefilesinarray
    limits: {
        files: 1,
        fileSize: 2097152 // 2 MB
    }
}));
app.post("/foo", function(request, response) {
    if (!request.files.hasOwnProperty("data")) {
        // 400 Bad Request
        return response.status(400).end();
    }
    var file = request.files.data[0];
    if (file.truncated) {
        // 413 Request Entity Too Large
        console.log("Request aborted.");
        return response.status(413).end();
    }
    // do stuff with file
});
于 2015-05-08T14:23:25.207 回答