函数+APIG:处理文件上传 本章节以NodeJS和Python语言为例,指导用户如何开发后端解析函数,获取上传的文件。 应用场景 端侧文件上传云主机器是Web和App应用的一类场景,例如服务运行日志的上报,Web应用图片上传等,函数可作为后端,结合APIG提供通用的API处理这类场景。 约束与限制 1. 单次请求上传文件大小不超过6MB。 2. 函数逻辑处理时间不超过15分钟。 操作步骤 1. 创建函数。 1. 登录函数工作流控制台,在左侧导航栏选择“函数 > 函数列表”,单击“创建函数”。 2. 选择“创建空白函数”,填写函数信息,完成后单击“创建函数”。选择运行时:Node.js 14.18。 3. 在“代码”页签,复制如下代码替换默认的函数代码,并单击“部署”更新函数。 const stream require("stream"); const Busboy require("busboy"); exports.handler async (event, context) > { const logger context.getLogger() logger.info("Function start run."); if (!("contenttype" in event.headers) !event.headers["contenttype"].includes("multipart/formdata")) { return { 'statusCode': 200, 'headers': { 'ContentType': 'application/json' }, 'body': 'The request is not in multipart/formdata format.', }; } const busboy Busboy({ headers: event.headers }); let buf Buffer.alloc(0); busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { logger.info('filename:' + JSON.stringify(filename)) file.on('data', function (data) { logger.info('Obtains ' + data.length + ' bytes of data.') buf Buffer.concat([buf, data]); }); file.on('end', function () { logger.info('End data reception'); }); }); busboy.on('finish', function () { //这里处理数据 logger.info(buf.toString()); return { 'statusCode': 200, 'headers': { 'ContentType': 'application/json' }, 'body': 'ok', }; }); //APIG(专享版)触发器默认对数据进行Base64编码,这里解码 const body Buffer.from(event.body, "base64"); var bodyStream new stream.PassThrough(); bodyStream.end(body); bodyStream.pipe(busboy); } 2. 配置函数依赖。 1. 制作依赖包。代码中选择busboy库解析上传的文件,需要生成Node.js14.18版本对应的依赖包busboy.zip。如果您使用Node.js语言其他版本,请制作对应版本的依赖包。 2. 创建依赖包。在左侧导航栏“函数 > 依赖包”管理页面,单击“创建依赖包”,配置完成后单击“确定”。 3. 添加依赖包。进入uploadfile1函数详情页面,在“代码”页签最底部,单击“添加依赖包”。在“私有依赖包”的包源中,选择上一步创建的busboy依赖包,单击“确定”,完成依赖包的添加。 3. 配置APIG(专享版)触发器。 1. 在uploadfile1函数详情页面,单击“设置 > 触发器”,开始创建触发器。 2. 单击“创建触发器”,触发器类型可以选择“API 网关服务(APIG 专享版)”。安全认证:此处为方便测试,配置“None”,实际业务请选择更安全的认证方式,例如IAM认证等。请求协议:选择“HTTPS”。请求方法:在下拉列表中根据需求选择。后端超时(毫秒):默认5000毫秒。 4. 端到端测试:以curl工具为例(curl F的方式主要用的是linux环境),您也可以选择postman等其他工具,在本地创建app.log文件,内容自定义。执行如下命令测试: curl iv {APIG(专享版)触发器URL} F upload@/{本地文件路径}/app.log