Многопартийная загрузка файлов с парсером тела с использованием angularjs и nodejs
Попытка загрузить файл из пользовательского интерфейса Angularjs на сервер nodejs, но сталкивается с проблемами с bodyparser, добавляя ограничение к нему бросает -
"SyntaxError: неожиданный токен - в JSON в позиции 0",
если лимит не добавил бросков -
"Слишком большая полезная нагрузка"
Я использую промежуточное программное обеспечение connect-multiparty для загрузки файла. Пробовал с {limit: '50mb'} в bodyparser и без каких-либо ограничений.
Код пользовательского интерфейса -
$('#imgupload').on('change', function (evt) {
let uploadedFiles = evt.target.files;
let formData = new FormData();
for (var i = 0; i < uploadedFiles.length; i++) {
formData.append("uploads[]", uploadedFiles[i],
uploadedFiles[i].name);
}
let url = "/upload";
httpService.restApi(url,formData)
.then(function (response) {
console.log("the file has been uploaded to local server
",response);
});
});
Nodejs (код сервера)-
const multipart = require('connect-multiparty');
const multipartMiddleware = multipart({ uploadDir: './uploads' });
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({extended: true}));
app.post('/upload', multipartMiddleware, (req, res) => {
res.json({
'message': 'File uploaded succesfully.'
});
});
2 ответа
Удалить bodyParser
промежуточное ПО с пути:
const multipart = require('connect-multiparty');
const multipartMiddleware = multipart({ uploadDir: './uploads' });
̶a̶p̶p̶.̶u̶s̶e̶(̶b̶o̶d̶y̶P̶a̶r̶s̶e̶r̶.̶j̶s̶o̶n̶(̶{̶l̶i̶m̶i̶t̶:̶ ̶'̶5̶0̶m̶b̶'̶}̶)̶)̶;̶
̶a̶p̶p̶.̶u̶s̶e̶(̶b̶o̶d̶y̶P̶a̶r̶s̶e̶r̶.̶u̶r̶l̶e̶n̶c̶o̶d̶e̶d̶(̶{̶e̶x̶t̶e̶n̶d̶e̶d̶:̶ ̶t̶r̶u̶e̶}̶)̶)̶;̶
app.post('/upload', multipartMiddleware, (req, res) => {
res.json({
'message': 'File uploaded succesfully.'
});
});
Содержание application/form-data
не application/json
или же application/x-www-form-urlencoded
,
Если вы используете multer и выполняете вызов API с использованием $http, явно задав заголовок "Content-Type" для multipart/form-data, вы получите "Multer: Boundary not found error", и если вы удалите заголовок "Content-Type" или установите его в false, он выдает - "Преобразование круговой структуры в ошибку JSON". Следовательно, я использовал "fetch" для вызова API, так как он автоматически идентифицировал "Content-Type".
Код пользовательского интерфейса (измененный как показано ниже) -
$('#imgupload').unbind('change').on('change', function (evt) {
evt.stopPropagation();
evt.preventDefault();
let uploadedFiles = evt.target.files;
let formData = new FormData();
for(let i=0; i<uploadedFiles.length;i++){
formData.append("uploads", uploadedFiles[i], uploadedFiles[i].name);
}
let url = '/upload';
var req = {
method: 'POST',
body: formData
}
fetch(url,req).then(function(response) {
console.log("the file has been uploaded to local server ",response);
$scope.uploadToSftp();
});
});
Код Nodejs (изменен как показано ниже) -
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads/')
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
})
const multipartMiddleware = multer({ storage: storage });
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({
extended: true
}));
app.post('/upload', multipartMiddleware.array("uploads",2), function(req, res)
{
console.log("the upload api is called");
return res.send(req.files);
});