angular multipart/form-data, sails.js 接收文件出现取不到值

angular 上传文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$http({
method: 'POST',
url: 'url',
headers: {
'Content-Type': undefined
},
transformRequest: function(data) {
var formData = new FormData();
angular.forEach(function(value, key){
formData.append(key, value);
});
return formData;
},
data: {
file: 'xxxx',
otherData: 'xxxxx'
}
});

sails 接收文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var fs = require('fs');
var Promise = require('bluebird');

new Promise(function(resolve, reject) {
req.file('file').upload(function(err, newFiles) {
if(err || !newFiles || !newFiles[0]) {
return reject(err);
}
resolve(newFiles[0]);
});
})
.then(function(file) {
filePath = file.fd;
var stream = fs.createReadStream(filePath);
return stream;
})
.then(function(stream){
// do something
})
.catch(function(e){
// do something
})
.finally(function() {
fs.unlink(filePath, function(err) {
if(err) {
sails.log.warn(err);
}
});
});

如果仅有文件上传, 或者上传的文件较小,不会发生问题,
但是既上传文件又上传其他字段

会导致 sails 无法取得 requestNo 的数据

故 使用 sails 接收 multipart/form-data 时, 前端上传时文件必须放最后面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var fd = new FormData();
fd.append('requestNo', data.requestNo);
// file文件必须放最后面
fd.append('file', data.file);


return $http({
method: 'POST',
url: 'url',
headers: {
'Content-Type': undefined
},
data: fd,
transformRequest: angular.identity
})
.then(function(data) {
return data && data.data || {};
});

参考文档:


文章若有纰漏请大家补充指正,谢谢~~
http://blog.xinshangshangxin.com SHANG殇