我有一个项目需要下载大量图片,几百M到上G。图片托管在七牛,使用七牛的打包服务并直接下载,不走自己服务器。
基本的操作流程是:客户端点击下载按钮,发送 AJAX 到服务器,服务器向七牛发送打包命令,七牛收到命令后立即返回一个 id,可用于查询处理状态,七牛打包完成后向服务器发送处理结果,里面包含了打包文件的下载地址,服务器通知客户端下载。
问题在于,当图片数量较多时,七牛的打包过程可能需要等待数分钟之上,在这个过程中如何处理客户端的等待呢?
我自己的设计是:
1,客户端点击下载后出一个弹窗,提示用户下载可能需要很久,不要关闭窗口或刷新,请耐心等待
2,服务器收到七九返回的 id 后立即作为对 AJAX 的响应返回给客户端,并把 id 和状态码(0表示还没处理完)保存到一个对象中
3,服务器收到七牛的处理结果通知后,把对象中对应 id 的状态改成1,并加入下载地址属性
4,客户端收到 id 后设置每隔30秒重新发起一次请求,查询处理结果
5,服务器收到客户端查询请求后在对象里查找对应的状态并返回,如果是0客户端就继续轮询,如果是1同时也返回下载地址,客户端下载
6,服务器返回下载信息给客户端后删除对象里对应的 id 属性
以上是我自己想的流程。我没什么经验,希望大家如果有更好的流程还请指点
个人觉得,对于大量图片的打包,可以将这些图片的打包分批进行。比如将A,B,C,D这四个文件按照更小的粒度去做,比如A,B 和C,D这两批单独去进行,这样打包的效率会提升很快。当然这些需要在本地服务中去请求然后将这两个压缩包统一合并为一个,如果考虑到服务器性能问题,那么可以将锅甩给前端吧,用html5来做zip.js。
我觉得你这个方法挺好的啊。
@joney-pinkman 的方案还是比较复杂,虽然会快一点。不过切分文件的事情,感觉也不好做吧,而且还涉及服务端的拆包打包。
有一点要注意的就是,服务器这边需要记录一下用户的 download 操作,保证用户在刷新页面之后,还能继续等待。