问题
最近需要对用户开放文件批量下载,经过对成本和带宽流量的综合考虑,选择了将文件放在阿里云的OSS上。但是涉及到批量下载问题时,OSS似乎并没有提供打包的方法。
对于问题提出了多种方案,但是均否定:
- 前端批量下载 —— 客户体验较差
- 前端批量获得文件流后使用JSZIP生成压缩包 —— 涉及到大量小文件下载时速度较慢,对浏览器性能要求较大
- 服务端压缩后提供下载 —— 占用服务器性能和带宽
解决思路
利用阿里云云函数功能,在阿里云内网对文件批量压缩后上传到OSS并且回传文件流
准备工作
部署
clone工程
git clone https://github.com/awesome-fc/zip-oss.git
安装 funcraft
配置 funcraft
运行 fun config 依次配置 Account ID、Access Key Id、Secret Access Key、 Default Region Name
打开zip-oss项目并部署
函数的配置在template.yml文件中推荐不要修改
<code> event.json
为基础请求实例,可以参考。
执行 <code> fun deploy
部署函数到线上,部署时可选部署区域等信息。
测试
<code> fun deploy
执行后会返回函数的URL
我们可以通过对该url进行post请求获得文件流
请求参数
<code> event.json
为基础请求实例
{
"region": "cn-shanghai",
"bucket": "bullet001",
"source-dir": "zip/test/"
}
除此之外还有另外两个请求参数,具体描述如下
{
"region": "cn-shanghai", // OSS所在区域
"bucket": "bullet001", // OSS Bucket名称
"source-dir": "zip/test/", // 需要打包的文件所在目录
"source-files": ["zip/test/event.json"], // 需要打包的文件key列表 (可选,若不传则打包整个目录)
"dest_file": 'output/zip-temp.zip' // 打包后的文件所在地址
}
发送请求
linux curl:
cat <<EOF > event.json
{
"region": "cn-hangzhou",
"bucket": "fc-test-tianlong-wu",
"source-dir": "files/"
}
EOF
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/
postman(返回内容为zip的文件流)
参考文章
具体实现细节可以查看参考文章。
使用函数计算打包下载OSS文件
Funcraft