上传ZIP包并自动解压

更新时间:
复制 MD 格式

当您需要批量上传文件、按特定目录结构上传文件、上传完整的文件或对文件快速进行资源分发时,可以配置解压规则,上传ZIP文件到OSS指定路径,触发函数计算自动解压,并将解压后内容保存回OSS。

前提条件

已开通函数计算服务。您可以在函数计算的产品详情页面开通函数计算服务。

使用场景

  • 批量上传:当您有大量小文件需要上传时,使用程序上传耗时较多,此时可以使用ZIP包解压功能,将文件打包上传。

  • 上传完整的文件:出于资源完整性考虑,有时需要将多个文件组合成一个资源,而将多个文件分别上传可能成功率不高,此时可以使用ZIP包解压功能,提升上传成功率。

  • 按特定目录结构上传:网站中引用了很多静态资源,资源的目录结构比较复杂,如果在OSS中逐一新建目录上传文件的话耗时很长。此时可以在本地定义ZIP包中目录结构,压缩后上传到OSS,使用ZIP包解压功能解压使用。

  • 资源分发:在需要将大量文件分发给用户或不同服务器时,可以将这些文件打包成ZIP包,并使用OSS ZIP包解压功能将ZIP包解压到指定目录。这样可以减少传输时间和带宽消耗。

实现原理

ZIP包解压结合函数计算完成ZIP文件的解压工作,解压流程如下图所示。

image
  1. “匹配解压规则后缀”的ZIP文件上传到“满足OSS解压规则前缀”的目录。

  2. 自动触发函数计算。

    配置ZIP包解压规则时需要触发器授权,以便OSS使用触发器角色AliyunOSSEventNotificationRole调用函数计算,触发器授权时自动为该角色授予调用函数计算的权限策略。

  3. 函数计算解压ZIP文件,并将解压后的文件存储至OSS的指定目录中。

    配置ZIP包解压规则时需要给函数计算服务授权。授权时将新建角色,函数计算使用角色获取OSS上的ZIP包,并将解压后的文件保存回OSS。新建角色时会同步授予角色相应的权限策略(对OSS Bucket的读写权限)。

费用说明

ZIP包解压功能是增值服务,将产生OSS和函数计算相关费用,Bucket资源和函数计算资源通过Bucket的内网域名进行传输,内网域名传输数据免流量费用:

  • OSS:请求Bucket资源的请求数计费和存储费用。更多信息,请参见OSS计费概述

  • 函数计算:vCPU使用量费用、内存使用量和磁盘使用量费用,按执行时间计费。更多信息,请参见FC计费概述

    例如:ZIP包解压执行了5分钟,vCPU2核,内存是3GB,默认创建的临时存储文件的硬盘大小为 10 GB,费用计算如下:

    资源使用项

    单位

    说明

    计费示例

    vCPU使用量

    vCPU*秒

    活跃vCPU使用量 = vCPU规格 × 执行时长(秒)

    函数配置的vCPU规格为2核,单次运行了300s,则单次运行的vCPU使用量为2 ×300 = 600 vCPU*秒

    内存使用量

    GB*秒

    内存使用量 = 内存规格× 执行时长(秒)

    函数配置的内存规格为3GB,单次运行了300s,则单次运行的内存使用量为3 ×300 = 900 GB*秒

    磁盘使用量

    GB*秒

    磁盘使用量 = 磁盘规格 × 执行时长(秒)

    说明:512 MB以下磁盘使用量免费。

    函数配置的临时硬盘大小为10 GB,单次运行了300s,则单次运行的磁盘使用量为(10-512/1024) × 300 = 2850 GB*秒

使用限制

  • 地域限制:ZIP包解压功能依赖函数计算服务,仅在函数计算已部署的地域可用。如果Bucket所在地域不支持函数计算,则无法使用ZIP包解压功能,OSS控制台的数据处理页面中也不会显示ZIP包解压选项。建议在创建Bucket前,确认目标地域是否支持函数计算。函数计算支持的地域请参见函数计算支持的地域

  • 存储类型限制:冷归档或者深度冷归档存储类型的文件需先解冻再解压;归档存储类型的文件,如果所在Bucket未开启归档直读,需先解冻再解压。

  • 文件或文件夹命名限制:建议使用UTF-8GB 2312编码命名您的文件或文件夹,否则可能会出现解压后的文件或文件夹名称出现乱码、解压过程中断等问题。

  • 压缩包限制:ZIP压缩包中单个文件的大小不超过1 GB,解压单个压缩包默认的最大时间是2小时,超过2小时可以调整函数最大执行时长,详情请参见解压超大文件解压超过2h任务失败

配置ZIP包解压规则

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据处理 > ZIP 包解压

  4. 单击ZIP 包解压,在ZIP 包解压面板配置ZIP包解压规则。

    参数说明

    参数

    是否必选

    说明

    服务授权

    授予函数计算读写OSS和执行函数的权限。

    单击授权按钮,然后按照提示完成授权。

    触发器授权

    授予OSS访问函数计算的权限。

    单击授权按钮,然后按照提示完成授权。如果已完成授权,此项显示为触发器角色

    前缀

    配置触发函数计算的文件前缀。您上传指定前缀的ZIP文件或将ZIP文件上传至指定目录会触发函数计算。置空此项则匹配所有上传的ZIP文件。

    重要

    置空此项可能会触发循环执行,建议您配置文件前缀。更多信息,请参见如何避免循环触发?

    目标目录

    填写ZIP文件解压后存放的目录。置空此项,函数计算会将ZIP文件解压到当前Bucket的根目录。

    • 如果您需要在目标目录中保留ZIP文件名,则选中保留压缩文件名为路径目录

    • 如果您不需要保留ZIP文件名,直接将解压后的文件存放在目标目录,则选中直接解压到目标目录中。配置详情请参见以下配置示例。

    警告

    为避免影响OSS-HDFS服务的正常使用或者引发数据污染、数据丢失的风险,在开通了OSS-HDFS服务的Bucket中配置ZIP包解压规则时,禁止将目标目录填写为.dlsdata/

    配置示例

    场景

    配置方法

    解压后的文件结构

    所有上传至zipfolder目录的ZIP包均解压到destfolder目录,不保留ZIP包名称。

    • 前缀设置为zipfolder/

    • 目标目录设置为destfolder

    • 选中直接解压到目标目录中

    bucket  ├─── zipfolder/   │    ├─── a.zip│    └─── b.zip└─── destfolder/     ├─── a.txt     ├─── b.txt     └─── ...

    所有上传至zipfolder目录的ZIP包均解压到根目录,保留ZIP包名称。

    您需要配置如下参数:

    • 前缀设置为zipfolder/

    • 目标目录设置为空。

    • 选中保留压缩文件名为路径目录

    bucket  ├─── zipfolder/   │    ├─── a.zip│    └─── b.zip├─── a/│    ├─── a.txt│    └─── ...└─── b/     ├─── b.txt     └─── ...

    所有上传至zipfolder目录的ZIP包均解压到destfolder目录,保留ZIP包名称。

    您需要配置如下参数:

    • 前缀设置为zipfolder/

    • 目标目录设置为destfolder

    • 选中保留压缩文件名为路径目录

    bucket  ├─── zipfolder/   │    ├─── a.zip│    └─── b.zip└─── destfolder/     ├─── a/     │    ├─── a.txt     │    └─── ...     └─── b/          ├─── b.txt          └─── ...
  5. 选中同意知晓开通函数计算,然后单击确定

修改ZIP包解压配置

您可以根据自己的需求修改ZIP包解压的配置。

修改触发函数计算的文件前缀

  1. OSS控制台的ZIP 包解压页面,单击目标触发器右侧的编辑

  2. 在弹出的函数详情页面下的触发器管理页签,单击目标触发器右侧的编辑

  3. 编辑触发器对话框,修改文件前缀,其他参数保持默认配置。

  4. 单击确定

修改函数计算配置

  1. 在函数计算控制台的函数详情页面下的函数配置页签,单击目标触发器右侧的编辑

  2. 根据实际需求,修改函数计算相关配置,例如函数执行内存、执行超时时间等。

    具体操作,请参见管理函数

删除触发器

说明

删除后无法恢复,且不能继续使用当前触发器触发函数。执行中的任务会继续进行。

  1. 在函数详情页面下的触发器管理页签,单击目标触发器右侧的删除

  2. 在弹出的对话框,单击删除

获取解压结果

解压函数执行完成后,OSS 不会主动返回解压结果。可以通过以下方式获取解压结果,并将结果通知到自建后端服务。

方式一:通过异步任务模式查询解压状态

开启任务模式后,每次解压函数执行都会生成一条异步任务记录,可以在任务列表中查看任务状态,也可以调用 API 查询。

  1. 在函数计算控制台,进入解压函数的函数详情页面,单击任务页签。

  2. 在任务模式配置区域,单击编辑,开启任务模式。任务模式默认为关闭,同区域还可配置最大重试次数(默认 3 次)、消息最大存活时长(默认 1 天)和调用目标(默认未配置)。

  3. 开启后,每次解压函数执行都会生成一条异步任务记录,可以在任务列表中查看任务 ID、任务状态、起止时间、执行时长、已重试次数、请求 ID 和实例 ID。

  4. 也可以调用函数计算的 GetAsyncTask 接口查询任务状态,返回的任务状态为 Succeeded 表示解压任务执行成功。

方式二:配置异步调用目标服务,解压后自动通知

在任务模式配置区域,开启成功时调用其他服务失败时调用其他服务,即可在解压任务结束后自动通知指定的目标服务。目标服务支持以下四种类型:

  • 函数计算(FC)

  • 云消息队列 RocketMQ 版

  • 轻量消息队列(原 MNS)

  • 事件总线 EventBridge

解压任务成功或失败后,函数计算会自动调用您配置的目标服务,无需轮询任务状态。

方式三:通过自定义 HTTP 回调通知后端服务

内置的异步调用目标服务不支持自定义 HTTP 回调。如需将解压结果通知到自建后端服务(例如部署在 Kubernetes 集群中的服务),可以按以下方式实现:

  1. 新建一个 FC 函数,在该函数中向后端服务地址发送 HTTP 通知请求。

  2. 按方式二将该函数配置为解压函数的异步调用目标服务。

  3. 解压任务结束后,函数计算调用该函数,由该函数向后端服务发出 HTTP 通知。

相关文档

将多个文件打包成ZIP包下载

常见问题

上传文件后触发函数计算失败

ZIP包解压涉及OSS与函数计算服务的关联调用。ZIP文件上传到OSS后,OSS触发函数计算执行解压操作。OSS触发函数计算的调用可能失败,您可以在响应Header中通过x-oss-event-status的值(Base64编码)判断是否成功触发解压。如果x-oss-event-status的值解码后为{"Result": "Ok"},表示成功触发解压。如果x-oss-event-status的值解码后不为{"Result": "Ok"},表示触发解压失败,建议重新上传ZIP文件。具体操作,请参见简单上传

说明

ZIP压缩包中单个文件的大小不超过1 GB,解压单个压缩包的最大时间是2小时。

解压超大文件解压超过2h任务失败

函数默认最大执行时间是2h,配置ZIP包解压规则后可以在函数计算控制台修改时间,最大支持24h。

  1. OSS控制台的ZIP 包解压页面,单击目标触发器右侧的编辑

  2. 在弹出的函数详情页面下单击函数配置页签。

  3. 单击环境信息右侧的编辑

  4. 修改执行超时时间,然后单击确定

压缩包中单个文件超过1 GB

压缩包中单个文件超过1 GB,可以采用NAS作为解压临时工作目录。该方案可能会产生少量的NAS存储费用。具体参见unzip-oss-nas

是否支持嵌套的ZIP包解压

不支持。

配置ZIP包解压规则后,在OSS存储空间上传一个ZIP包,触发一次函数计算解压后传回OSS指定目录。如果解压后的文件中依然包括ZIP包,则该ZIP包不能再次解压。您可以将该ZIP包重新上传到OSS存储空间触发解压操作。

通过FC解压后的文件,能不能解压到另一个Bucket

不可以。

ZIP包解压功能仅支持将文件解压到配置ZIP包解压规则时设定的目标目录中。如果需要解压到另一个Bucket,需要基于函数代码做二次开发,修改代码。

解压过程中随时可以看到OSS目录的文件么

可以。

使用ZIP包解压功能时,函数计算边解压边上传文件到OSS,您可以随时在目标目录查看解压后的文件。

怎么判断已经解压完成

您可以查看函数调用日志,判断解压是否完成。

  1. OSS控制台的ZIP 包解压页面,单击目标触发器右侧的编辑

  2. 在弹出的函数详情页面下单击调用日志页签。

  3. 单击一键启用

  4. 为当前RAM角色授予AliyunLogFullAccess权限。具体操作,请参见管理RAM角色的权限

  5. 上传zip包文件,然后在函数日志页签查看调用日志。

    以下记录表明函数调用结束,可以说明解压完成。

    image.png

是否支持解压.rar和.tar.gz格式的文件

不支持。

ZIP包解压功能目前只支持解压.zip格式的文件。

ZIP包解压完毕后会返回信息给OSS

没有。

OSS 不会主动返回解压结果,具体获取方式,请参见获取解压结果

OSS是否支持在线压缩

不支持。

如果需要将OSS上多个文件(Object)打包下载到本地,可以使用函数计算打包下载。更多信息,请参见将多个文件打包成ZIP包下载

是否支持分卷压缩

不支持。

ZIP包解压功能只针对单个压缩包,不支持将多个压缩包解压后的内容进行合并,因此大文件分卷压缩成多个.zip压缩包的情况不支持解压。

ZIP包解压按钮为灰色,无法配置ZIP包解压规则

  • 确保函数计算服务已开通。您可以在函数计算的产品详情页面开通函数计算服务。

  • 只特定地域支持ZIP包解压。更多信息,请参见使用限制