关于React的下载组件能找出一大堆,基本原理是通过HTML API的blob对象将文件存储到本地。这个方法对小文件没问题,如果是大文件处理就比较麻烦。基于自己的实际需求就生出了这个以iframe为基础的下载按钮。
基本原理很简单,就是通过脚本自动创建一个 iframe,并实现下载。
那为什么是iframe呢?因为iframe可以传参数啊,这样下载就可以扩展出很多简单有用的玩法了。
在实际使用过程中还遇到一个小难点。
考虑这样一个情况,前端提交的下载链接带有参数(表单),但是参数超出了预设范围,这时候需要给到前端页面出错提示,那用什么方式合适?
- 直接使用 iframe 页面输出信息
- 使用 alert
- 使用回调,让应用程序内部处理
1和2 方案都有明显的缺点,就是无法和应用有机的结合,结果都太突兀。3是最终选用的方案,错误信息交给应用去处理,有回调,更加易于将信息处理融合到应用里去。
如何处理回调?我这里使用了 JSONP 方案,如果表单没有出错,则页面直接返回需要下载的文件或跳转到需要下载的内容;如果出错,则使用 JSONP 生成一个回调通知应用处理出错信息。
JSONP 解决了数据反馈问题,在实际使用中还有一个跨域问题需要处理。刚开始设计组件时没有考虑跨域问题,到实际项目中发现回调失效,调试后发现是跨域问题。好在目前的HTML5已经有完美的解决方案了,所以这个问题也不是实质性难点。