关于阿里云 OSS 文件打包下载的问题

一、问题描述

单个文件从1M500M,打包下载几十到近百个文件。
oss中批量下载object时会遇到批量下载不方便、文件较多时下载缓慢等。
一个稍微多一点的文件打包请求,未独立出去的打包服务可能很快就会导致服务器卡死。

这时你很快就意识到这个服务是时候独立出去了。

二、解决思路

买一台好点的服务器然后写一个打包的服务?

这听上去应该还不错。

你需要解决的不止一个单独的打包服务。

打包业务逻辑有可能是这样的 :

  1. 获取业务需要打包的文件path ,然后从oss 下载;
  2. 本地打包,再上传到阿里云得到下载path
  3. 实现下载压缩包文件,最后删除本地的缓存文件

也就是应用服务器上传下载(最好走内网)一整套步骤,加一个打包,
另外你还需要对你的接口实现鉴权。

三、解决办法

看一下 阿里云oss
利用函数计算打包下载OSS文件

详细流程:

  1. 用户调用函数,指定存储空间及待压缩的文件。
  2. 函数计算从OSS中获取指定文件,并生成随机名称的ZIP压缩包。
  3. 函数计算将压缩包上传至OSS。
  4. 函数计算将ZIP包的下载地址返回给用户。
  5. 用户使用返回的下载地址从OSS中下载文件。

关于阿里云部署函数计算步骤不再赘述,可以自行
查看具体操作步骤

四、函数计算代码修改

helper.py

...
def _main_handler(oss_client, evt, context):
    source_dir = evt.has_key('source-dir') and evt['source-dir']
    source_files = evt.has_key('source-files') and evt['source-files']
    dest_file = evt.has_key('dest-file') and evt['dest-file']
    if not dest_file:
        dest_file = 'output/' + context.requestId + '.zip'

    return zip_files(oss_client, source_dir, source_files, dest_file)

...

请求地址:XXX.cn-beijing.fc.aliyuncs.com/201...

postman传参json类型,如下:

{
"region": "cn-beijing",
"bucket": "blog",
"dest-file": "tmp/1234.zip",
"source-dir": "news/",
"source-files": [
        "news/logo/logo.png",
        "news/idcard/product2.jpg"
    ]
}

这养就可以根据业务的文件 path 如:tmp/1234.zip 去下载对应文件的压缩包了 。

One more thing

接口需要加一下鉴权

修改一下函数计算触发器认证方式,如图

认证方式,请求方式修改一下。
具体鉴权的示例文档

问题

本人对python 不是很熟悉。

  1. 参数必须要指定一个source-dir ,但是业务中存储的文件分布在不同的文件夹,我尝试传根目录,结果让人有点失望。
  2. 文件下载时要是可以指定不同的目录那会是一件让人很开心的事情。

要是有一套PHP版本的整个服务代码,那将会是意见非常棒的事情。

要是可以有一个相同功能的 composer 包那就太好了

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

我也是碰到了同样的需求,请教下,只能通过 python 声明函数去处理吗? PHP 没找到相关信息~

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!