Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说踩了坑:导出功能没做好,差点被投诉,希望能够帮助你!!!。
新上线的一个需求,大家都做得比较辛苦。
同时,也收到用户反馈功能功能不好用[石化]
反馈的问题是,导出的文件,根据文件名看不懂是哪次导出的内容。导出多了后,不好找。影响工作效率。
如果下载一个用户再自己重新命名一下,又会影响效率。
根据文件名不知道里面的内容
这就很烦了,
不改下名,不好找导出的文件。
改吧,又太麻烦。
用户又能拿这个功能怎么样,只能吐槽这个新功能不好用罢了
这是一个非功能的体验问题。
没有指定下载文件名,浏览器使用了默认的命名策略:将url上的非法字符去掉,然后拼一下。
如果得到的字符串太长,还会进行截断处理。
用户执行导出后,后端返回的是一个包含了导出内容的oss地址,也就是一个Url。前端直接把这个url填充到<a>标签的href属性。用户点击后进行下载
下载时的交互
这种情况下,浏览器下载时展示在状态栏上的名字,浏览器就自由发挥了,目前浏览器的命名规则是将url上的非法字符去掉,然后拼一下。
下载的文件名
方案1:由服务器写入数据流的方式下载,同时由服务器指定一个自定义的文件名。
方案2:服务器返回存放业务数据的oss地址,前端指定一个自定义的文件名。
最终选定了方案2。
原因是方案2改动最小,并且可以避免下载时导致业务数据缺失的问题。
客户都是用chrome,也规避了方案2的浏览器兼容性问题。
方案1:
服务器返回数据流的方式
https://www.processon.com/view/6363c4d2e0b34d77dbcd4919
优点:
缺点:
方案2:
使用oss作为数据中转站
https://www.processon.com/view/6363c4d2e0b34d77dbcd4919
优点:
缺点:
1.兼容性问题。
在 HTML5 中,download 属性是 <a> 标签的新属性。
兼容性
定义和用法<a download="filename">filename 规定作为文件名来使用的文本。
该属性也可以设置一个值来规定下载文件的名称。所允许的值没有限制,浏览器将自动检测正确的文件扩展名并添加到文件 (.img,.xls,.doc,.pdf, .txt, .html, 等等)。在 <a> 标签中必须设置 href 属性。
2.需要下载的资源是同源的
同源策略(Same origin policy)是基于安全的考虑,是浏览器阻止从一个源加载的文档或脚本获取或设置另一个源加载额文档的属性,是浏览器对JavaScript施加的安全限制,是浏览器最核心也最基本的安全功能。简单地说只要在浏览器里打开页面,就默认遵守同源策略,目的是为了保证用户的隐私安全和数据安全。
那么什么是同源呢?
所谓同源是指两个 URL的"协议+域名+端口"三者都相同
方案1:
按照http协议的要求,把业务数据转换成数据流写到HttpServletResponse
指定这个数据流的type:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
指定文件名:
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
show me the code
https://github.com/helloworldtang/spring-boot-cookbook/blob/master/learning-demo/src/main/java/com/tangcheng/learning/adapter/openapi/ExportController.java
方案2:
基于a标签在h5版本的新属性download,来指定下载到本地的文件名
https://github.com/helloworldtang/spring-boot-cookbook/blob/master/learning-demo/src/main/resources/templates/jsDownload.html
导出场景,服务器直接返回数据流到前端,要关注占带宽的情况。
如果是由前端指定下载的下载名,需要考虑兼容性问题。可以使用先fetch后将fetch到的数据流填充到新创建a标签的href属性来规避download属性的同源限制。
服务器返回oss url且指定自定义文件名。
注意事项:要解决文件名相同时会相互覆盖的问题。需要在url上对相同文件名的oss文件在path是进行区分。比如url是这种格式 ip/userId/yyyy/MM/dd/hh/mm/ss/SSS/一个随机数/自定义文件名
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章