函數+APIG:處理文件上傳
更新時間 2025-01-13 16:37:18
最近更新時間: 2025-01-13 16:37:18
分享文章
本章節以NodeJS和Python語言為例,指導用戶如何開發后端解析函數,獲取上傳的文件。
應用場景
端側文件上傳云主機器是Web和App應用的一類場景,例如服務運行日志的上報,Web應用圖片上傳等,函數可作為后端,結合APIG提供通用的API處理這類場景。
約束與限制
- 單次請求上傳文件大小不超過6MB。
- 函數邏輯處理時間不超過15分鐘。
操作步驟
-
創建函數。
- 登錄函數工作流控制臺,在左側導航欄選擇“函數 > 函數列表”,單擊“創建函數”。
- 選擇“創建空白函數”,填寫函數信息,完成后單擊“創建函數”。選擇運行時:Node.js 14.18。
- 在“代碼”頁簽,復制如下代碼替換默認的函數代碼,并單擊“部署”更新函數。
const stream = require("stream"); const Busboy = require("busboy"); exports.handler = async (event, context) => { const logger = context.getLogger() logger.info("Function start run."); if (!("content-type" in event.headers) || !event.headers["content-type"].includes("multipart/form-data")) { return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'body': 'The request is not in multipart/form-data 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': { 'Content-Type': 'application/json' }, 'body': 'ok', }; }); //APIG(專享版)觸發器默認對數據進行Base64編碼,這里解碼 const body = Buffer.from(event.body, "base64"); var bodyStream = new stream.PassThrough(); bodyStream.end(body); bodyStream.pipe(busboy); }
-
配置函數依賴。
- 制作依賴包。代碼中選擇busboy庫解析上傳的文件,需要生成Node.js14.18版本對應的依賴包busboy.zip。如果您使用Node.js語言其他版本,請制作對應版本的依賴包。
- 創建依賴包。在左側導航欄“函數 > 依賴包”管理頁面,單擊“創建依賴包”,配置完成后單擊“確定”。
- 添加依賴包。進入upload-file-1函數詳情頁面,在“代碼”頁簽最底部,單擊“添加依賴包”。在“私有依賴包”的包源中,選擇上一步創建的busboy依賴包,單擊“確定”,完成依賴包的添加。
-
配置APIG(專享版)觸發器。
- 在upload-file-1函數詳情頁面,單擊“設置 > 觸發器”,開始創建觸發器。
- 單擊“創建觸發器”,觸發器類型可以選擇“API 網關服務(APIG 專享版)”。安全認證:此處為方便測試,配置“None”,實際業務請選擇更安全的認證方式,例如IAM認證等。請求協議:選擇“HTTPS”。請求方法:在下拉列表中根據需求選擇。后端超時(毫秒):默認5000毫秒。
-
端到端測試:以curl工具為例(curl -F的方式主要用的是linux環境),您也可以選擇postman等其他工具,在本地創建app.log文件,內容自定義。執行如下命令測試:
curl -iv {APIG(專享版)觸發器URL} -F upload=@/{本地文件路徑}/app.log