前言
想必做过java开发的同学们都知道,后台系统经常会用到一些文件上传下载之类的功能,在做这些需求的时候往往会遇到很多坑,什么文件下载乱码啊,文件名被浏览器错误识别啊等等,下面是本人总结的一些工作经验,仅以java下载文件源码为例:
附上伪代码:
/** * response 方式下载文件 * 亲测 chorme firBox exploy 及苹果浏览器均支持 * @param fileName * @param request * @param response */ @RequestMapping("downLoadFile") public void getDownLoad(String fileName, HttpServletRequest request, HttpServletResponse response) { response.reset(); // 设置文件下载的格式 这种是让浏览器自己去识别文件格式 response.setContentType("application/octet-stream"); //文件名 怎么获取就不用多说了吧 String fileName2 = fileName; try { String userAgent = request.getHeader("User-Agent"); // name.getBytes("UTF-8")处理safari的乱码问题 byte[] bytes = userAgent.contains("MSIE") ? fileName.getBytes() : fileName.getBytes("UTF-8"); // 各浏览器基本都支持ISO编码 fileName = new String(bytes, "ISO-8859-1"); // 文件名外的双引号处理firefox的空格截断问题 response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName)); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } InputStream in = null; OutputStream out = null; try { //TODO你只需要在这里获取到你所要下载的文件的输入流 //以下输入流读到输出流中写回浏览器 int len = 0; byte bys[] = new byte[1024]; out = response.getOutputStream(); while ((len = in.read(bys)) > 0) { out.write(bys, 0, len); } out.close(); out.flush(); //完成 后 关闭流 } catch (IOException e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (Exception e) { e.printStackTrace(); } } } }
总结:
以上仅是我个人在实施过程中的经验代码总结,个人测试各个浏览器都支持,并且已在线上运行1年多,以后遇到类似的需求基本上不需要再查询资料,拿过来就可以用了,如果你绝的有用可以试一下,好用的话收藏,有什么问题可能我个人能力有限,希望大家多多指教,创建这个账号的目的就是记录自己的成长,同时传播个人成长经历,有喜欢的可以关注我,我们互相进步
提示:
文件上传,实时进度监听等,参考:https://www.toutiao.com/i6616979763879739918/