當您需要從對象存儲OSS中批量下載多個文件時,可能會遇到批量下載不方便、小文件較多等情況。 您可以通過函數計算將對象存儲OSS中的多個文件打包下載至本地,既可以節約時間又可以節省流量和相關費用。
流程及實現細節
流程圖
使用函數計算在對象存儲OSS中同時下載多個文件的流程圖如下:
按需調用函數,指定存儲空間及待壓縮文件。
調用函數后,函數計算從對象存儲OSS中下載目標文件并壓縮成ZIP包。
函數計算將ZIP包上傳到對象存儲OSS中。
函數計算將給您返回目標ZIP文件在對象存儲OSS中的地址。
您可以通過步驟4返回的地址下載目標文件。
前提條件
已開通函數計算服務。具體操作,請參見開通函數計算服務。
已開通OSS服務并在OSS創建存儲空間。具體操作,請參見開通OSS服務并創建存儲空間。
已安裝并配置Serverless Devs。具體操作,請參見安裝Serverless Devs和配置Serverless Devs。
操作步驟
執行以下命令,初始化項目。
sudo s init start-zip-oss -d start-zip-oss
執行以下命令,進入項目,并進行項目部署。
cd start-zip-oss && sudo s deploy - y
部署成功后,輸出示例如下。記錄返回的
system_url
,在調用函數時需要使用。Checking Service, Function, Triggers (2.44s) Creating Service, Function, Triggers (1.18s) ...... fc-zip-oss-service: region: cn-hangzhou service: name: zip-oss function: name: zip-oss-func runtime: python3.9 handler: main.main_handler memorySize: 3072 timeout: 1800 url: system_url: https://zip-oss-func-zip-oss-****.cn-hangzhou.fcapp.run system_intranet_url: https://zip-oss-func-zip-oss-****.cn-hangzhou-vpc.fcapp.run triggers: - type: http name: http-test
應用部署成功后,調用部署好的函數下載多個文件。
在
start-zip-oss
目錄下創建event.json文件,并在文件中指定Bucket名稱以及待下載的文件。通過
source-dir
指定要下載的文件所在的目錄。cat <<EOF > event.json { "bucket": "bucketname", "source-dir": "filepath/" } EOF
通過
source-files
指定要下載的文件列表。cat <<EOF > event.json { "bucket": "bucketname", "source-files": ["files1.txt","filepath/files2.txt"] } EOF
使用curl命令直接調用函數。
在
start-zip-oss
目錄下創建一個文件夾用于存放壓縮的文件,本文以tmp
文件夾為例。執行的curl命令示例如下:說明請將命令示例中的訪問地址更新為您部署應用成功后返回的公網訪問地址
system_url
。curl -v -L -o /tmp/my.zip -d @./event.json https://zip-oss-func-zip-oss-****.cn-hangzhou.fcapp.run
調用成功后,您可以在
start-zip-oss/tmp
文件夾中查看到下載的壓縮文件。同時登錄對象存儲控制臺,在相應的Bucket下的output
目錄也可以看到下載的壓縮文件。
實驗數據
場景 | 文件數 | 壓縮前總大小 | 壓縮后總大小 | 執行時間 |
1 | 7 | 1.2 MB | 1.16 MB | 0.4s |
2 | 57 | 1.06 GB | 0.91 GB | 63s |
您可以通過以上表格獲取以下兩個信息:
場景1說明使用函數計算實現多個文件的下載,可以減少文件的存儲空間。
場景2說明使用函數計算實現多個文件的下載,可以在短時間內下載大量文件。
相關文檔
如果您需要解壓上傳到OSS的ZIP文件,可以在函數計算部署函數實現ZIP文件自動解壓,也可以直接在OSS配置ZIP文件自動解壓,具體請參見使用函數計算實現OSS壓縮文件的自動解壓和ZIP包解壓。
如果您需要在一個Bucket內關聯大于10個以上的觸發器,可以選擇創建EventBridge類別的OSS觸發器,具體請參見配置EventBridge類別的OSS觸發器。