2015-03-10 9 views
4

Я использую NodeJs Multer для загрузки файлов. Мне нужно отправить ответ обратно клиенту, когда пользователь пытается загрузить слишком большой файл. Проблема в том, что onFileSizeLimit имеет только файл как аргумент, и я не знаю, как отправить ответ клиенту. Что мне нужно сделать, это в основном soomething, как показано ниже:Как отправить ответ клиенту, когда файлы слишком велики с Multer

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 объект существует доцент там однако, и мне интересно, что это лучший способ, чтобы отправить своего рода ответ на клиента.

ответ

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 обработчика, передает req, res, next от обратного вызова Экспресса, а значит, вы получите доступ к req, res, next переменным в конфигурации Multer в.

Я не проверял это, но я думаю, что теория звучит!

+0

вы сэр являются гениальными! Кстати, знаете ли вы, что у вас хорошие URL-адреса, которые охватывают промежуточное ПО и трюки, которые вы показываете в своем примере? Не удалось найти ничего интересного, кроме базового экспресс-использования – spirytus

+1

, но похоже, что multer все еще загружает первую часть файла до предела размера файла, заменяя то, что есть с частичным файлом? – PixMach

+0

@PixMach, у меня такая же проблема. Я просто удаляю этот частичный файл. Не уверен, есть ли лучший способ. –

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

Это лучший ответ, чем тот, который указан как ответ выше. Если вы используете onFileUploadComplete для возврата json и onFileSizeLimit, чтобы вернуть json одновременно, вы получите сообщение об ошибке с узла: невозможно установить заголовки после их отправки. –

0

multer объектный файл на самом деле содержит свойство, указывающее, превысил ли файл предельный размер. См https://www.npmjs.com/package/multer#multer-file-object

Чтобы принять только один файл с максимальным размером 2 МБ и название «данные» Я сделал что-то вроде этого:

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

Это вопрос, который не был решен автором покажут. Это GitHub issue имеет довольно много дискуссий по этому поводу:

1

Существует одна работа, вокруг которого я использовал в моем текущем проекте

Файл: Make-middleware.js изменение «функции сделали (ERR)» в конец этой функции

Заменить Line 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 
    } 
}); 
Смежные вопросы