完美的java解决下载文件问题
2016-07-22 00:00
591 查看
最近在做一个下载功能,这应该是比较简单的问题了,但却碰到一个非常奇怪的问题。点击下载以后,显示的却是如下的显示框:
将文件下载下来,修改后缀却发现,这个文件已经下载下来了,只是要手工修改后缀才行
一看后台代码,已经设置了文件名,但却没有起到任何的作用,更奇怪的是,要下载的文件我将文件外面的《要下载的文件》 "《》"给删除掉,下载下来的文件名成了一道 杠,网上搜索了相关的代码,然后照着写了几个,却没有任何作用。最后发现问题的关键在于用普通的字节流并没有将这些代码带到要下载文件中。
如下解决方案:
前端代码
后端
关键代码:
如上代码和我之前的代码最大不同是他使用的是字符流的形式,同时,这些设置文件的名字以及文件长度、类型也是在流里面的时候写入的
将文件下载下来,修改后缀却发现,这个文件已经下载下来了,只是要手工修改后缀才行
一看后台代码,已经设置了文件名,但却没有起到任何的作用,更奇怪的是,要下载的文件我将文件外面的《要下载的文件》 "《》"给删除掉,下载下来的文件名成了一道 杠,网上搜索了相关的代码,然后照着写了几个,却没有任何作用。最后发现问题的关键在于用普通的字节流并没有将这些代码带到要下载文件中。
如下解决方案:
前端代码
后端
关键代码:
//找到服务器放置文件的位置 String url = request.getSession().getServletContext().getRealPath("resources/downRequisition/"); String fileName = hashMap.get(request.getParameter("filename")); String fileUrl = url + fileName; OutputStream toClient = null; try { File file = new File(fileUrl); String filename = file.getName(); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(fileUrl)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器 } else{ filename = URLEncoder.encode(filename, "UTF-8"); } // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + filename); response.addHeader("Content-Length", "" + file.length()); toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); } catch (IOException e) { e.printStackTrace(); } finally { if (toClient != null) { toClient.flush(); toClient.close(); } } //返回null为了解决 has already been called for this response错误 return null;
如上代码和我之前的代码最大不同是他使用的是字符流的形式,同时,这些设置文件的名字以及文件长度、类型也是在流里面的时候写入的
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Scrapy的架构介绍
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序