当您需要从对象存储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触发器。