关于在浏览器设置文件的下载
非框架法,仅供学习
什么是文件下载呢?就是将服务器上已经存在的文件,输出到客户端浏览器.说白了就是把服务器端的文件拷贝一份到客户端, 文件的拷贝—> 流(输入流和输出流)的拷贝。
文件下载的方法一(不推荐):
链接的方式:直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了。
那么在浏览器直接放置超链接即可。
//在web下创建download文件夹,里面有web.zip文件
<a href="download/web.zip">web.zip</a>
但这种方式存在弊端,即浏览器可直接打开的资源不会进行下载,如jpg文件会直接在浏览器打开。
文件下载的方法二(推荐):
手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会下载。
手动编码方式要求:设置两个头和一个流
- 设置的两个头:
Content-Dispostion:浏览器识别该格式文件,提示浏览器下载.
Content-Type:文件类型.(MIME的类型) - 设置一个流:
获得要下载的文件的输入流.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户传过来的文件名
String fileName = request.getParameter("fileName");
// 设置文件的输入流
InputStream resourceAsStream = getServletContext().getResourceAsStream("/download/" + fileName);
// 获取浏览器信息 判断是哪一个浏览器
String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("Firefox")){//火狐浏览器 Firefox base64编码
fileName = base64EncodeFileName(fileName);
}else{//谷歌浏览器
// 其它浏览器
fileName = URLEncoder.encode(fileName,"UTF-8");
}
// 告诉浏览器需要下载
response.setHeader("Content-Disposition","attachment;filename=" + fileName);
// 告诉浏览器下载文件的MIME类型
String type = getServletContext().getMimeType(fileName);
response.setHeader("Content-Type",type);
// 获取响应字节输出流
OutputStream outputStream = response.getOutputStream();
byte[] bs = new byte[1024];
int len = 0;
while ((len = resourceAsStream.read(bs)) != -1){
outputStream.write(bs,0,len);
}
outputStream.close();
resourceAsStream.close();
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
由于浏览器和服务器编码格式不同问题,需要进行编码格式的设置,(tomcat为西欧编码格式),否则下载中文文件的名字会异常。
总结:
文件下载可直接获取对应文件的流进行传输,但需实现告诉浏览器要进行下载任务,即 response.setHeader(“Content-Disposition”,“attachment;filename=” + 文件名)和设置下载文件的类型 response.setHeader(“Content-Type”,文件类型);
**注:**如果下载文件名中带有中文的文件需要将文件名设置对应的编码格式,否则文件名会异常,因为tomcat是ISO 8859-1(西欧编码),而浏览器中,如firefox是base64编码格式,会出现格式不匹配。