Azure Functions上的Node.js服务器+ Angular 6客户端:正确处理多部分表单数据

时间:2018-08-08 09:05:25

标签: node.js angular azure azure-functions

我正在尝试将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);

等...

0 个答案:

没有答案