Javascript 使用$http.post发送formData会返回较大文件的空正文

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 =

我正在尝试通过我的web应用程序上载文件。我有以下代码:

视图:

上载服务:

(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对此表示感谢,如果可能的话,希望避免添加更多依赖项,特别是因为我的解决方案实际上适用于某些示例。我觉得答案可能在于我如何配置这个解决方案,而不是解决方案本身。