关于阿里云 OSS 文件打包下载的问题
一、问题描述
单个文件从1M
到500M
,打包下载几十到近百个文件。
从oss
中批量下载object
时会遇到批量下载不方便、文件较多时下载缓慢等。
一个稍微多一点的文件打包请求,未独立出去的打包服务可能很快就会导致服务器卡死。
这时你很快就意识到这个服务是时候独立出去了。
二、解决思路
买一台好点的服务器然后写一个打包的服务?
这听上去应该还不错。
你需要解决的不止一个单独的打包服务。
打包业务逻辑有可能是这样的 :
- 获取业务需要打包的文件
path
,然后从oss
下载; - 本地打包,再上传到阿里云得到下载
path
; - 实现下载压缩包文件,最后删除本地的缓存文件
也就是应用服务器上传下载(最好走内网)一整套步骤,加一个打包,
另外你还需要对你的接口实现鉴权。
三、解决办法
看一下 阿里云oss
利用函数计算打包下载OSS文件
详细流程:
- 用户调用函数,指定存储空间及待压缩的文件。
- 函数计算从OSS中获取指定文件,并生成随机名称的ZIP压缩包。
- 函数计算将压缩包上传至OSS。
- 函数计算将ZIP包的下载地址返回给用户。
- 用户使用返回的下载地址从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)
...
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
不是很熟悉。
- 参数必须要指定一个
source-dir
,但是业务中存储的文件分布在不同的文件夹,我尝试传根目录,结果让人有点失望。 - 文件下载时要是可以指定不同的目录那会是一件让人很开心的事情。
要是有一套PHP版本的整个服务代码,那将会是意见非常棒的事情。
要是可以有一个相同功能的 composer
包那就太好了
推荐文章: