我正在尝试将zip文件从Angular客户端上载到node.js服务器,客户端和服务器都在Azure函数应用中作为Azure函数运行。
在本地,我正在使用multer包来处理node.js中的zip上传,并且效果很好。但是,由于Azure函数应用程序不支持req.pipe和其他流处理程序,因此multer无法正常工作。
我使用parse-multipart编写了一个新的功能应用程序,我能够在服务器上获取zip数据,但是文件已损坏,并且与源zip文件的大小略有不同。我用png尝试了相同的结果。
以下是相关的Angular客户代码:
uploadFile(fileToUpload: File): Observable<Array<MyDataEntity>> {
const formData = new FormData();
formData.append('package', fileToUpload, fileToUpload['name']);
return this.httpClient.post<Array<MyDataEntity>>(
environment.serverUri + '/api/upload',
formData
);
}
和node.js服务器代码(作为Azure函数运行):
var multipart = require("parse-multipart");
const fs = require('fs');
const INPUT_DIRECTORY = 'packages/input';
const OUTPUT_DIRECTORY = 'packages/output';
module.exports = function (context, req, res) {
context.log('JavaScript HTTP trigger function processed a request.');
if (!req.body) {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
else {
var bodyBuffer = Buffer.from(req.body, 'binary');
context.log('file length: ' + bodyBuffer.length);
// get boundary for multipart data e.g. ------WebKitFormBoundaryDtbT5UpPj83kllfw
var boundary = multipart.getBoundary(req.headers['content-type']);
context.log('file boundary: ' + boundary);
// parse the body
var parts = multipart.Parse(bodyBuffer, boundary);
const archiveFilePath = __dirname + '/' + INPUT_DIRECTORY + '/' + parts[0].filename;
// write buffer to file
fs.writeFile(archiveFilePath, new Buffer(parts[0].data), 'binary', (err) => {
context.log('Archive file path: ' + archiveFilePath);
if (err) {
context.res = {
status: 404,
body: "Failed to save the package"
};
}
});
context.res = { body : { name : parts[0].filename, type: parts[0].type, data: parts[0].data.length}};
}
context.done();
};
输出样本:
2018-08-08T08:57:33.799 [信息]功能已启动(Id = 9cdd063a-75b2-4738-a15a-3031893beddd)
2018-08-08T08:57:33.799 [Info] JavaScript HTTP触发函数处理了一个请求。
2018-08-08T08:57:33.799 [Info]文件长度:345
2018-08-08T08:57:33.799 [Info]文件边界:---- WebKitFormBoundarysae4JeoqAeEmVoim
2018-08-08T08:57:33.848 [Info]功能已完成(成功,Id = 9cdd063a-75b2-4738-a15a-3031893beddd,持续时间= 58ms)
2018-08-08T08:57:33.878 [Info]存档文件路径:D:\ home \ site \ wwwroot \ UploadPackage / packages / input / something.zip
我尝试更改缓冲区的编码类型,我为不同的编码类型获得了不同的缓冲区大小,但没有一个生成正确的输出文件:
var bodyBuffer = Buffer.from(req.body, 'binary');
var bodyBuffer = Buffer.from(req.body, 'utf8');
var bodyBuffer = Buffer.from(req.body);
等...