如何使用Azure中的Node JS功能上载文件

时间:2018-05-25 09:40:54

标签: node.js azure azure-functions serverless

我正在尝试创建一个处理文件上传的Azure功能。我尝试了不同的选项(尝试直接读取请求或使用强大的功能)。

对于这两种情况,我在执行函数时遇到以下错误。

Exception while executing function: Functions.UploadFile. mscorlib: TypeError: req.on is not a function  
    at IncomingForm.parse (D:\home\site\wwwroot\node_modules\formidable\lib\incoming_form.js:117:6)  
    at module.exports (D:\home\site\wwwroot\UploadFile\index.js:5:10)  
    at D:\Program Files (x86)\SiteExtensions\Functions\1.0.11702\bin\azurefunctions\functions.js:106:24.  

功能代码如下

var formidable = require("formidable");  

module.exports = function (context, request) {  
    context.log('JavaScript HTTP trigger function processed a request.');      
    var form = new formidable.IncomingForm();  
    form.parse(request, function (err, fields, files) {  
        context.res = { body : "uploaded"};  
    });  
    context.done();  
};  

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我得到了以下工作。 Request对象既不是Azure函数中的Stream也不是EventEmitter(在AWS lambda中也是如此)。它只是填充了正文和标题。我从https://www.npmjs.com/package/parse-multipart获得了帮助。我不得不为Azure功能调整它

var multipart = require("parse-multipart");

module.exports = function (context, request) {  
    context.log('JavaScript HTTP trigger function processed a request.'); 
    // encode body to base64 string
    var bodyBuffer = Buffer.from(request.body);
    // get boundary for multipart data e.g. ------WebKitFormBoundaryDtbT5UpPj83kllfw
    var boundary = multipart.getBoundary(request.headers['content-type']);
    // parse the body
    var parts = multipart.Parse(bodyBuffer, boundary);
    context.res = { body : { name : parts[0].filename, type: parts[0].type, data: parts[0].data.length}}; 
    context.done();  
};

这似乎可以更好地与Azure Function 2.x运行时(beta)一起使用。我已经更新了代码。我用PDF,JPG,PNG和XLSX进行了测试。

答案 1 :(得分:0)

请确保您正在阅读二进制数据,如此处所述 -
https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings#binding-datatype-property

  

对于动态类型的语言(如JavaScript),请使用 function.json 文件中的dataType属性。例如,要以二进制格式读取HTTP请求的内容,请将dataType设置为binary

{
   "type": "httpTrigger",
   "name": "req",
   "direction": "in",
   "dataType": "binary"
}
     

dataType的其他选项包括streamstring