這是一個包含了函數計算每種 Runtime 結合 HTTP Trigger 實現文件上傳和文件下載的示例集。每個示例包括:
- 一個公共 HTML 頁面,該頁面有一個文件選擇框和上傳按鈕,會列出已經上傳的文件,點擊某個已上傳的文件可以把文件下載下來;
- 支持文件上傳、下載和列舉的函數。
我們知道不同語言在處理 HTTP 協議上傳下載時都有很多中方法和社區庫,特別是結合函數計算的場景,開發人員往往需要耗費不少精力去學習和嘗試。本示例集編撰的目的就是節省開發者甄別的精力和時間,爲每種語言提供一種有效且符合社區最佳實踐的方法,可以拿來即用。
當前已支持的 Runtime 包括:
- nodejs
- python
- php
- java
計劃支持的 Runtime 包括:
- dotnetcore
不打算支持的 Runtime 包括:
- custom
使用限制
由於函數計算對於 HTTP 的 Request 和 Response 的 Body 大小限制均爲 6M,所以該示例集只適用於藉助函數計算上傳和下載文件小於 6M 的場景。對於大於 6M 的情況,可以考慮如下方法:
- 分片上傳,把文件切分成小塊,上傳以後再拼接起來;
- 藉助於 OSS,將文件先上傳 OSS,函數從 OSS 上下載文件,處理完以後回傳 OSS;
- 藉助於 NAS,將大文件放在 NAS 網盤上,函數可以像讀寫普通文件系統一樣訪問 NAS 網盤的文件。
快速開始
安裝依賴
在開始之前請確保開發環境已經安裝瞭如下工具:
- docker
- funcraft
- git
- make
構建並啓動函數
克隆代碼:
git clone https://github.com/vangie/fc-file-transfer
本地啓動函數:
$ make start
...
HttpTrigger httpTrigger of file-transfer/nodejs was registered
url: http://localhost:8000/2016-08-15/proxy/file-transfer/nodejs
methods: [ 'GET', 'POST' ]
authType: ANONYMOUS
HttpTrigger httpTrigger of file-transfer/python was registered
url: http://localhost:8000/2016-08-15/proxy/file-transfer/python
methods: [ 'GET', 'POST' ]
authType: ANONYMOUS
HttpTrigger httpTrigger of file-transfer/java was registered
url: http://localhost:8000/2016-08-15/proxy/file-transfer/java
methods: [ 'GET', 'POST' ]
authType: ANONYMOUS
HttpTrigger httpTrigger of file-transfer/php was registered
url: http://localhost:8000/2016-08-15/proxy/file-transfer/php
methods: [ 'GET', 'POST' ]
authType: ANONYMOUS
function compute app listening on port 8000!
make start
命令會調用 Makefile 文件中的指令,通過 fun local
在本地的 8000 端口開放 HTTP 服務,控制檯會打印出每個 HTTP Trigger 的 URL 、支持的 HTTP 方法,以及認證方式。
效果演示
上面四個 URL 地址隨便選一個在瀏覽器中打開示例頁面。
接口說明
所有示例都實現了下述四個 HTTP 接口:
GET /
返回文件上傳 Form 的 HTML 頁面GET /list
以 JSON 數組形式返回文件列表POST /upload
以multipart/form-data
格式上傳文件fileContent
作爲文件字段fileName
作爲文件名字段
GET /download?filename=xxx
以application/octet-stream
格式返回文件內容。
此外爲了能正確的計算相對路徑,在訪問根路徑時如果不是以/
結尾,都會觸發一個 301 跳轉,在 URL 末尾加上一個/
。
不同語言的示例代碼
已知問題
“阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”