Recently I have to work with quite a lot of Azure based services. I had to write a Function that accept a file upload. Which then I realized, that Azure Functions does not have built in mechanism or API to handle file upload easily.
I ended up writing an npm module for this issue: https://www.npmjs.com/package/@anzp/azure-function-multipart
An example on how to use it:
import { AzureFunction, Context, HttpRequest } from "@azure/functions"; import parseMultipartFormData from "@anzp/azure-function-multipart"; const httpTrigger: AzureFunction = async function ( context: Context, req: HttpRequest ): Promise<void> { const { fields, files } = await parseMultipartFormData(req); context.log("HTTP trigger function processed a request."); const name = req.query.name || (req.body && req.body.name); const responseMessage = { fields, files, }; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage, }; }; export default httpTrigger;
Example client request using CURL:
curl --request POST \ --url http://localhost:7071/api/HttpTrigger1 \ --header 'Content-Type: multipart/form-data; boundary=---011000010111000001101001' \ --form update=false \ --form collection=@/Users/anzhari/masterdata/managements.json
This is the example reponse received on the client:
{ "fields": [ { "fieldname": "update", "value": "false", "fieldnameTruncated": false, "valueTruncated": false, "encoding": "7bit", "mimetype": "text/plain" } ], "files": [ { "fieldname": "file", "bufferFile": { "type": "Buffer", "data": [ 91, 10, ... 10, 93 ] }, "filename": "managements.json", "encoding": "7bit", "mimetype": "application/json" } ] }
Hope it can help anybody struggling with this issue!
Top comments (1)
Hi Anzhari, this is a great idea, I've always struggled with multiprat/form-data. IN mt current function I'm using this package. I'm submitting to table storage.
Trying to do it like this (pardon my TypeScript):
tableService.insertEntity(tableName,{...thisKey,...fields},{ echoContent: true }
This is not working, I assume because fields is an array and not an object. I'm going to fix this with my middling Typescript skills, and I'm sure I will learn something.
I was wondering if an option to return an object for fields is a possibility, so that spread can be used? What do you think?