在NodeJs中上传文件期间停止请求

时间:2011-08-02 03:55:02

标签: file-upload node.js

我正在写一个图像上传器,我想将图像的大小限制在3mb以下。在服务器端,我可以检查标题中图像的大小,如下所示(使用快速):

app.post('/upload', function(req, res) {
  if (+req.headers['content-length'] > 3001000) { // About 3mb
     // Do something to stop the result
     return res.send({'error': 'some kind of error'});
  }
  // Stream in data here...
}

我试图通过(和permeations)来停止req。

req.shouldKeepAlive = false;
req.client.destroy();
res.writeHead(200, {'Connection': 'close'});
res.end()

他们都没有真正“破坏”阻止更多数据上传的请求。 req.client.destroy()似乎冻结了下载,但是res.send({error ...没有被发回。

帮助!

2 个答案:

答案 0 :(得分:5)

抛出错误并抓住它。它将停止文件上传,允许您发送响应。

try { throw new Error("Stopping file upload..."); } 
catch (e) { res.end(e.toString()); }

有点hackish,但它有效...

答案 1 :(得分:0)

这是我的解决方案:

var maxSize = 30 * 1024 * 1024;    //30MB
app.post('/upload', function(req, res) {

    var size = req.headers['content-length'];
    if (size <= maxSize) {
        form.parse(req, function(err, fields, files) {
            console.log("File uploading");
            if (files && files.upload) {
                res.status(200).json({fields: fields, files: files});
                fs.renameSync(files.upload[0].path, uploadDir + files.upload[0].originalFilename);
            }
            else {
              res.send("Not uploading");
            }
        });
    }
    else {
        res.send(413, "File to large");
    }

如果在获得响应之前浪费客户端的上传时间,请在客户端javascript中控制它。

if (fileElement.files[0].size > maxSize) {
    ....
}