您的位置:首页 > 编程语言 > Java开发

完美的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 下载