Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当Multer的文件太大时,如何向客户端发送响应_Javascript_Node.js_Express_Multer - Fatal编程技术网

Javascript 当Multer的文件太大时,如何向客户端发送响应

Javascript 当Multer的文件太大时,如何向客户端发送响应,javascript,node.js,express,multer,Javascript,Node.js,Express,Multer,我正在使用NodeJs上传文件。当用户试图上传的文件太大时,我需要将响应发送回客户端。问题是,onFileSizeLimit只有file作为参数,我不知道如何向客户端发送响应。我需要做的基本上是如下所示: app.use('/users/gyms/upload-logo', multer({ // other settings here then: onFileSizeLimit: function (file) { // but res (response) o

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

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
object dosent存在于其中,但我想知道向客户端发送某种响应的最佳方式是什么。

在这种情况下,最好记住Multer本身只是一个(中间件)函数,用于表示调用以获得响应

您可以尝试以下方法:

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别名为handler,从Express回调传递
req,res,next
,意味着您可以从multer的配置中访问
req,res,next
变量

我还没有测试过这个,但我认为这个理论是正确的

试试这个:

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);
        }
    }
});

multer file对象实际上包含一个属性,指示文件是否超出了大小限制。看

要仅接受一个最大大小为2MB且名称为“data”的文件,我执行了以下操作:

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
});

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

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

文件:make-middleware.js 在此函数末尾更改“函数完成(错误)”

替换 第52行:
onFinished(请求,函数(){next(err)})

与: 第52行:
onFinished(req,函数(){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
    }
}); 

先生,你是个和蔼可亲的人!顺便说一句,您是否知道任何好的URL,包括中间件和您在示例中展示的技巧?除了基本的express用法之外,找不到任何有趣的东西,但multer似乎仍将文件的第一部分上传到文件大小限制,并用部分文件替换其中的内容?@PixMach,我遇到了同样的问题。我只是删除了那个部分文件。不确定是否有更好的方法。这是一个比上面标记为答案的更好的答案。如果使用onFileUploadComplete返回json,同时使用onFileSizeLimit返回json,您将从节点得到一个错误:发送头后无法设置头。