通过 API 进行多文件打包压缩

最后更新时间:2021-10-08 15:28:08

    准备工作

    1. 文件打包压缩功能通过云函数(Serverless Cloud Function,SCF)实现,使用前需在对象存储控制台 应用集成 - ZIP 多文件打包 上创建 ZIP 多文件打包 函数。
    2. 函数创建后,根据函数列表操作栏的 使用引导,完成函数参数配置。具体函数所需参数配置请参考下文,格式为 JSON 字符串
      • 对于选择云函数鉴权的函数,需要调用 SCF 提供的运行函数(Invoke)接口来运行云函数,其中的 ClientContext 参数以 json 格式传入,请参见 函数参数配置示例
      • 对于选择免鉴权的函数,则可以直接向对应的 API 网关发起 HTTP 请求来调用函数。

    函数参数配置示例

    说明:

    实际使用当中,需将代码中的注释去掉。

    {
      "bucket": "examplebucket-1250000000",    // 最终投递 ZIP 文件的存储桶
      "region": "ap-guangzhou",         // 最终投递 ZIP 文件的存储桶所在地域
      "key": "mypack.zip",              // 最终投递 ZIP 文件的名称
      "flatten": false,                 // 是否需要对源文件路径进行扁平化处理
       /**
       * sourceList 用于指定需打包的源文件列表,格式为 JSON 数组
       * 每一项包含源文件 url,重命名的路径 renamePath 等
       * 
       * 如果源文件列表过长,可将 sourceList 参数 JSON 字符串化
       * 写入 .json 文件,上传到 COS,并通过 sourceConfigList 参数指定
       * 
       * sourceList 和 sourceConfigList 参数仅需指定一种即可
       */
      "sourceList": [
          {
              "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir1/file1.jpg",
              "renamePath": "dir1_rename/file1.jpg"
          },
          {
              "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir2/file2.mp4",
              "renamePath": "file2.mp4"
          },
          {
              "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/file3.md"
          }
      ],
      "sourceConfigList": [
          {
               "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceList.json"
          }
      ]
    }
    

    参数说明如下:

    参数名 参数描述 类型 是否必填
    bucket 最终投递 ZIP 文件的存储桶,命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式,例如:examplebucket-1250000000 String
    region 最终投递 ZIP 文件的存储桶所在地域,枚举值请参见 地域和访问域名 String
    key 最终投递 ZIP 文件的名称(Object 的名称),对象在存储桶中的唯一标识,详情请参见 对象概述 String
    flatten 是否需要路径扁平化(去除源目录结构),例如:源文件 URL 为 https://domain/source/test.mp4, 则源文件路径为 source/test.mp4,如果为 true,则 ZIP 包中该文件路径为 test.mp4,否则 ZIP 包中该文件路径为 source/test.mp4。默认为 false Boolean
    sourceList 源文件列表,sourceList 和 sourceConfigList 不能同时为空 Array
    sourceList[].url 源文件的 URL String
    sourceList[].renamePath 带路径的重命名,即源文件在 ZIP 包中的文件路径。例如,将 dir1/file1.jpg 重命名为 dir1_rename/file1.jpg。
    注意:renamePath 的优先级高于 flatten,重命名后的路径不受扁平化影响
    String
    sourceConfigList sourceList 的配置文件列表,如果您不希望在请求时携带整个 sourceList,可以将 sourceList 参数 JSON 字符串处理,生成 json 配置文件,上传到 COS,并在 sourceConfigList 中指定该文件的 URL,支持指定多个配置文件,sourceList 和 sourceConfigList 不能同时为空 Array
    sourceConfigList[].url sourceList 配置文件的 URL String

    函数响应结果示例

    {
     code: 0,
     data: {
       Bucket: "examplebucket-1250000000",
       ETag: "\"35bb5e5f050e22bed8f443d8da5dbfb8-1\"",
       Key: "mypack.zip",
       Location: "examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/mypack.zip"
     },
     error: null,
     message: "cos zip file success"
    }
    

    响应参数说明如下:

    参数名 参数描述 类型
    code 业务错误码,如果为 0 则说明执行成功,否则为执行失败 Number
    message 执行结果的文字说明,可能为 null String
    data 执行成功的信息,如果执行成功,则包含 ZIP 包的 url 信息 Object
    error 执行的错误信息,如执行成功则为 null Object or String

    实际案例

    案例一:简单案例

    参数配置

    {
     "bucket": "examplebucket-1250000000",
     "region": "ap-guangzhou",
     "key": "mypack.zip",
     "flatten": false,
     "sourceList": [
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir1/file1.jpg"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir2/file2.mp4"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/file3.md"
         }
     ]
    }
    

    最终 ZIP 压缩包结构

    mypack.zip
      ├── dir1/file1.jpg
      ├── dir2/file2.mp4
      └── file3.md
    

    案例二:源文件路径扁平化

    参数配置

    {
     "bucket": "examplebucket-1250000000",
     "region": "ap-guangzhou",
     "key": "mypack.zip",
     "flatten": true,                  // flatten 为 true,对源文件路径进行扁平化处理
     "sourceList": [
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir1/file1.jpg"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir2/file2.mp4"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/file3.md"
         }
     ]
    }
    

    最终 ZIP 压缩包结构

    mypack.zip
      ├── file1.jpg
      ├── file2.mp4
      └── file3.md
    

    案例三:源文件路径重命名

    参数配置

    {
     "bucket": "examplebucket-1250000000",
     "region": "ap-guangzhou",
     "key": "mypack.zip",
     "flatten": false,
     "sourceList": [
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir1/file1.jpg",
             // 将 dir1/file1.jpg 路径重命名为 dir1_rename/file1.jpg
             "renamePath": "dir1_rename/file1.jpg"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir2/file2.mp4",
             // 将 dir2/file2.mp4 重命名为 file2.mp4
             "renamePath": "file2.mp4"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/file3.md"
         }
     ]
    }
    

    最终 ZIP 压缩包结构

    mypack.zip
      ├── dir1_rename/file1.jpg
      ├── file2.mp4
      └── file3.md
    

    案例四:源文件路径重命名 + 扁平化

    参数配置

    {
     "bucket": "examplebucket-1250000000",
     "region": "ap-guangzhou",
     "key": "mypack.zip",
     "flatten": true,         // flatten 为 true,对源文件路径进行扁平化处理
     "sourceList": [
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir1/file1.jpg"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/dir2/file2.mp4"
         },
         {
             "url": "https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/file3.md",
             // 将 file3.md 重命名为 dir3/file3.md,renamePath 优先级比 flatten 高,因此重命名后的路径不会被扁平化
             "renamePath": "dir3/file3.md"
         }
     ]
    }
    

    最终 ZIP 压缩包结构

    mypack.zip
      ├── file1.jpg
      ├── file2.mp4
      └── dir3/file3.md