【问题标题】:multer/node file upload works perfectly for files <20kb, hangs on files 20kb-1mb, and returns 502 error for files >1mbmulter/node 文件上传对于 <20kb 的文件非常有效,挂在 20kb-1mb 的文件上,对于 >1mb 的文件返回 502 错误
【发布时间】:2020-02-29 11:29:33
【问题描述】:

我正在开发一个简单的文件上传网站,但一直无法无误地上传文件。当要上传的文件小于 ~20kb 时,我现在拥有的代码可以完美运行,但对于大于该文件但小于 ~1mb 的文件,仅上传了约 20kb 的文件(因此会损坏文件)。

对于大于 1mb 的文件,上传完全失败并返回 502 错误。我已经确定增加 multer 文件大小/字段大小限制并且永远不会收到文件太大的错误。

当上传~20kb-1mb之间的文件时,没有前端或后端错误,但multer似乎在上传时“挂起”,从未到达上传回调函数。

编辑我已经删除了前端代码,因为这似乎是一个节点/配置错误

app.js 文件(已删除无关代码)

const express    = require('express');
const multer     = require('multer');
const path       = require('path');
const bodyParser = require('body-parser');
const glob       = require('glob');
const fs         = require('fs');

const app  = express();
const PORT = process.env.PORT || 3000;

const storage = multer.diskStorage({
    destination: function(req, file, callback) { callback(null, './public/file') },
    filename: function(req, file, callback) { callback(null, req.fileCode + '-' + file.originalname) },
});

const upload = multer({storage: storage, limits: {fileSize: 1024 * 1024 * 1024, fieldSize: 10000000000}}).single('selectedFile');



app.use(bodyParser.json({ limit: '5mb', extended: true })); //added from user suggestions
app.use(bodyParser.urlencoded({ limit: '5mb', extended: true }));

app.use(express.static(path.join(__dirname, 'public', 'media', 'styles.css')));
app.use(express.static(path.join(__dirname, 'public', 'media', 'scripts.js')));

app.get(["/","/index.html.var"], (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

app.post('/upload-file', function(req, res) {
    let fileCode = genFileCode();

    glob("**/public/file/" + fileCode + "*.*", function (err, files) {
        if(files[0])
            fileCode = genFileCode();

        req.fileCode = fileCode;

        console.log("check 1");

        upload(req, res, function(e) {
            console.log("check 2");

            if(e)
                console.log("error " + e);
            else
                console.log("no error");
        });

        res.send(fileCode);
    });  
});

^^完全相同的文件(~370kb)被多次上传,都导致不同的大小,没有一个是完整的文件(都已损坏)

上传任何大于~1mb的文件时会出现^^502错误

【问题讨论】:

    标签: node.js express xmlhttprequest multer


    【解决方案1】:

    您的正文解析限制在后端似乎小于 1 MB。 将以下行更改为您的服务器配置文件:

    app.use(bodyParser.json({limit: '5mb', extended: true}))

    app.use(bodyParser.urlencoded({limit: '5mb', extended: true}))

    您可以根据自己的条件设置限制。

    【讨论】:

      【解决方案2】:

      如果有人偶然发现这一点并且处于与我相同的情况,我已经发现了我的错误:

      upload(req, res, function(e) {
              console.log("check 2");
      
              if(e)
                  console.log("error " + e);
              else
                  console.log("no error");
          });
      
          res.send(fileCode);
      

      这里似乎 app.js 正在发送响应在上传回调并提前结束文件上传。将 res.send 放在回调中似乎已经解决了一切

      【讨论】:

        【解决方案3】:

        您的代码看起来不错。

        尝试改变这两行

        const upload = multer({storage: storage, limits: {fileSize: 5MB, 
        fieldSize: 5MB}}).single('selectedFile');
        

        我正在更改建议。保持前一个不变并尝试这个。 希望这会锻炼。

        【讨论】:

        • 非常感谢您的帮助,我已经实施了您的建议,但不幸的是没有任何改变。我已经添加了我的 app.js 文件,也许你能发现我做错了什么??
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        相关资源
        最近更新 更多