如何在http POST(angularjs + expressjs)中随文件一起发送数据?

Łuk*_*asz 4 express angularjs multer

情况

我实现了文件上传。前端代码取自流行教程。我在服务中发送 POST:

myApp.service('fileUpload', ['$http', function ($http) {
    this.uploadFileToUrl = function(file, uploadUrl){
        var fd = new FormData();
        fd.append('file', file);
        
        $http.post(uploadUrl, fd, {
             transformRequest: angular.identity,
             headers: {'Content-Type': undefined}
        })
        
        .success(function(){
        })
       
        .error(function(){
         });
        }
    }]);
Run Code Online (Sandbox Code Playgroud)

后端典型的multer用法:

exports.postFile = function (req, res) {

    var storage = multer.diskStorage({ //multers disk storage settings
        destination: function (req, file, cb) {
            cb(null, '../documents/')
        },
        filename: function (req, file, cb) {
            cb(null, file.originalname)
        }
    });

    var upload = multer({ //multer settings
        storage: storage
    }).single('file');

    upload(req, res, function (err) {
        if (err) {
            res.json({error_code: 1, err_desc: err});
            return;
        }
        res.json({error_code: 0, err_desc: null});
    })

};
Run Code Online (Sandbox Code Playgroud)

那个有效。

如何在同一个 POST 中发送一些数据,比如说 string "additional info"

我试过的

我尝试在服务中添加数据,即:

...
var fd = new FormData();
fd.append('file', file);
fd.append('model', 'additional info');

$http.post(uploadUrl, fd, {...})
Run Code Online (Sandbox Code Playgroud)

好像是发送了,但是不知道后台怎么接收。试图在req(没有成功)中找到它。

Łuk*_*asz 6

要在一个 POST 请求中发送数据(即 json)和文件,请将两者都添加到表单数据中:

myApp.service('fileUpload', ['$http', function ($http) {
    this.uploadFileToUrl = function(file, uploadUrl){
        var fd = new FormData();
        fd.append('file', file);

        var info = {
            "text":"additional info"
        };
        fd.append('data', angular.toJson(info));

        $http.post(uploadUrl, fd, {
             transformRequest: angular.identity,
             headers: {'Content-Type': undefined}
        })

        .success(function(){
        })

        .error(function(){
        });
    }
}]);
Run Code Online (Sandbox Code Playgroud)

在服务器端,它在req.body.data,所以它可以被接收,即像这样:

upload(req, res, function (err) {
    if (err) {
        res.json({error_code: 1, err_desc: err});
        return;
    }

    console.log(req.body.data);

    res.json({error_code: 0, err_desc: null});
})
Run Code Online (Sandbox Code Playgroud)