Javascript 使用$http.post发送formData会返回较大文件的空正文
我正在尝试通过我的web应用程序上载文件。我有以下代码: 视图: 上载服务:Javascript 使用$http.post发送formData会返回较大文件的空正文,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,我正在尝试通过我的web应用程序上载文件。我有以下代码: 视图: 上载服务: (function (){ 'use strict'; angular.module('cica.common').service('uploadService', ['$http', '$window', '$routeParams', uploadService]); function uploadService($http, $window, $routeParams) { this.upload =
(function (){
'use strict';
angular.module('cica.common').service('uploadService', ['$http', '$window', '$routeParams', uploadService]);
function uploadService($http, $window, $routeParams) {
this.upload = function (file, name, type) {
const fd = new FormData();
fd.append('document', file);
let jobId = ($routeParams.jobId)? $routeParams.jobId: $routeParams.caseJobId;
fd.append('jobId', jobId);
fd.append('documentRename', name);
fd.append('documentType', type);
console.log(fd);
return $http.post('/document/upload', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).catch(function(err){
handleHttpError('Unable to upload document.', err);
});
};
function handleHttpError(prefix, response){
throw prefix + ' HTTP Status ' + response.status + ': ' + response.statusText;
};
}
})();
routes.js:
'POST /document/upload': {controller: 'DocumentController', action: 'uploadDocument'},
文档管理员:
function uploadFile(){
if (vd.uploadForm.file.$valid && vd.file) {
$('#uploadModal').modal('show');
return uploadService.upload(vd.file, "Convictions Calculator", "PCCS").then(function(response){
vd.documentName = vd.file.name;
vd.uploadedFilePath = response.data;
$('#uploadModal').modal('hide').removeClass("in");
$(".modal-backdrop").remove();
alertService.setAlert('File uploaded', 'success');
}).catch(handleServiceError);
}
}
"use strict";
const fs = require('fs');
module.exports = {
uploadDocument: function (req, res) {
const params = req.allParams();
const jobId = params.jobId;
const uploadedFileName = params.documentRename;
const uploadedFileType = params.documentType;
const awardsDirectoryKey = this.documentUploadDirectories.ADDITIONAL_AWARDS;
req.file('document').upload({
// don't allow the total upload size to exceed ~100MB
maxBytes: 100000000
}, function whenDone(err, uploadedFiles) {
if (err) {
return res.serverError(err);
}
// If no files were uploaded, respond with an error.
else if (uploadedFiles.length === 0) {
return res.serverError('No file was uploaded');
} else {
const filePath = uploadedFiles[0].fd;
const filename = DocumentService.addDateToDocumentName(uploadedFiles[0].filename);
return fs.readFile(filePath, function (err, data) {
if (err) {
return res.serverError(err);
} else {
const jobId = params.jobId;
const jobVars =
{
filePath: results.filePath,
fileName: uploadedFileName,
fileType: uploadedFileType
};
return DocumentService.uploadConvictions(req.session.sessionId, jobId, jobVars).then(function (response) {
return res.send("Document uploaded.");
}).catch(function (err) {
return res.serverError(err);
});
}
});
}
});
},
console.log(req.allParams());
如果我上传一个带有小图片(约11kB)的jpeg,上传效果完全符合预期。然而,如果我试图上传一个更大的jpeg(大约170kB),它就会崩溃。虽然没有立即抛出/捕获错误,但发生的情况是在上载服务中创建的formData对象似乎丢失了其数据。如果我将此行插入DocumentController:
function uploadFile(){
if (vd.uploadForm.file.$valid && vd.file) {
$('#uploadModal').modal('show');
return uploadService.upload(vd.file, "Convictions Calculator", "PCCS").then(function(response){
vd.documentName = vd.file.name;
vd.uploadedFilePath = response.data;
$('#uploadModal').modal('hide').removeClass("in");
$(".modal-backdrop").remove();
alertService.setAlert('File uploaded', 'success');
}).catch(handleServiceError);
}
}
"use strict";
const fs = require('fs');
module.exports = {
uploadDocument: function (req, res) {
const params = req.allParams();
const jobId = params.jobId;
const uploadedFileName = params.documentRename;
const uploadedFileType = params.documentType;
const awardsDirectoryKey = this.documentUploadDirectories.ADDITIONAL_AWARDS;
req.file('document').upload({
// don't allow the total upload size to exceed ~100MB
maxBytes: 100000000
}, function whenDone(err, uploadedFiles) {
if (err) {
return res.serverError(err);
}
// If no files were uploaded, respond with an error.
else if (uploadedFiles.length === 0) {
return res.serverError('No file was uploaded');
} else {
const filePath = uploadedFiles[0].fd;
const filename = DocumentService.addDateToDocumentName(uploadedFiles[0].filename);
return fs.readFile(filePath, function (err, data) {
if (err) {
return res.serverError(err);
} else {
const jobId = params.jobId;
const jobVars =
{
filePath: results.filePath,
fileName: uploadedFileName,
fileType: uploadedFileType
};
return DocumentService.uploadConvictions(req.session.sessionId, jobId, jobVars).then(function (response) {
return res.send("Document uploaded.");
}).catch(function (err) {
return res.serverError(err);
});
}
});
}
});
},
console.log(req.allParams());
结果为小文件打印预期的变量,但为大文件返回空,这最终会在函数尝试进一步使用这些变量时导致错误。是否对通过此方法上载的文件大小设置了某种限制,或者我的配置不正确 您可以使用multer上传文件。。向传递给multer的option对象添加limit属性值。@Anil对此表示感谢,如果可能的话,希望避免添加更多依赖项,特别是因为我的解决方案实际上适用于某些示例。我觉得答案可能在于我如何配置这个解决方案,而不是解决方案本身。