全部产品
云市场
云游戏

使用函数计算 zip 打包下载 OSS 文件

更新时间:2020-03-13 17:54:10

需求

打包下载 OSS 上存储的多个文件,例如将OSS上的一个目录打包下载。这样可以节省网络传输的数据,达到减少费用和下载时间的效果。

方案

使用函数计算先把多个文件压缩成一个 zip,存储到 OSS上面,返回 zip 文件的地址,客户端下载此文件。一般的客户端都支持跟随 HTTP 302 跳转地址,所以在完成压缩后,返回一个302的地址,客户端再跟随这个地址下载压缩后的文件包。

zip_oss_high

部署

准备工作

免费开通函数计算

免费开通对象存储 OSS

1. clone 解压工程

  1. git clone https://github.com/awesome-fc/zip-oss.git

如果没有安装 git, 可以直接在浏览器输入 https://codeload.github.com/awesome-fc/zip-oss/zip/master 下载代码 zip 包

2. 安装最新版本的 funcraft

funcraft 安装配置指引

在使用 funcraft 前,我们需要先进行配置,通过键入 fun config,然后按照提示,依次配置 Account ID、Access Key Id、Secret Access Key、 Default Region Name 即可

3. 部署函数, 执行 fun deploy

4. 调用函数

  1. 在OSS上准备要打包的文件

    • 把文件放在OSS上面一个目录下面, 比如 files目录
  2. 触发函数(通过HTTP trigger地址)

    • 使用curl命令直接调用函数
  1. cat <<EOF > event.json
  2. {
  3. "region": "cn-hangzhou",
  4. "bucket": "fc-test-tianlong-wu",
  5. "source-dir": "files/"
  6. }
  7. EOF
  8. curl -v -L -o /tmp/my.zip -d @./event.json https://123456789.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/zip-service/zip-oss/

打开/tmp/my.zip,就是files/目录下所有文件的压缩包。

实现细节

  1. 函数运行环境的磁盘空间是有限的,采用流式下载和上传的方式,只在内存中缓存少量的数据。
  2. 为了加快速度,一边生成zip文件时一边上传到OSS
  3. 上传zip文件到OSS时,利用OSS分片上传的特性,多线程并发上传

zip_oss_low

实验

实验数据

# 文件数 压缩前总大小 压缩后总大小 执行时间
1 7 1.2MB 1.16MB 0.4s
2 57 1.06GB 1.06GB 63s