загрузка файлов multer / node отлично работает для файлов <20 КБ, зависает на файлах 20 КБ-1 МБ и возвращает ошибку 502 для файлов> 1 МБ - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю на простом сайте загрузки файлов, и у меня возникают проблемы с последовательной загрузкой файлов без ошибок. Код, который у меня есть, теперь отлично работает, когда загружаемый файл меньше, чем ~ 20 КБ, но для файлов, размер которых больше этого, но меньше, чем ~ 1 МБ, загружается только около ~ 20 КБ файла (что приводит к повреждению файла).

Для файлов размером более 1 МБ загрузка завершается неудачно и возвращает ошибку 502. Я был уверен, что увеличил лимит размера файлов / полей мультитера и никогда не получал слишком большую ошибку файла.

при загрузке файла размером ~ 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);
    });  
});

enter image description here ^^ один и тот же файл (~ 370kb) загружается несколько раз, и все они имеют разные размеры и ни один из них не является полным файлом (все повреждены)

enter image description here

^^ Ошибка 502 возникает при загрузке любого файла размером более ~ 1 МБ

Ответы [ 3 ]

0 голосов
/ 04 ноября 2019

Кажется, что ваш предел разбора тела менее 1 МБ в бэкэнде. Измените следующие строки в файле конфигурации вашего сервера:

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

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

Вы можете установить лимиты в соответствии с вашими критериями.

0 голосов
/ 04 ноября 2019

Я понял свою ошибку, если кто-то наткнулся на это и находится в той же ситуации, в которой я находился:

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 в обратном вызове, похоже, решило все

0 голосов
/ 04 ноября 2019

Ваш код выглядит нормально.

Попробуйте изменить эти две строки

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

Я изменяю sugesstion. Сохраните предыдущую как есть и попробуйте эту. Надеюсь, что это будет тренировки.

...