标签:文件下载
在创建一个文件夹,名称download,先拷入要下载的一些文件protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 先获取到文件的名称
String filename = request.getParameter("filename");
// 解决中文乱码
filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
// System.out.println("要下载的文件名称:"+filename);
//设置两个头一个流
// 设置第一个头,值可以是MIME类型,可以获取该文件的MIME类型
String type = this.getServletContext().getMimeType(filename);
response.setHeader("content-type",type);
// 先获取到用户使用的浏览器的信息,根据浏览器的信息采用不同的编码,例如火狐,采用Base64编码,使用IE采用的URL编码
// 先判断浏览器的信息
String agent = request.getHeader("user-agent");
// Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
// System.out.println(agent);
String name = null;
if(agent.contains("Firefox")){
// 使用是火狐,采用Base64编码
name = base64EncodeFileName(filename);
}else{
// 使用的是IE或者谷歌,使用URL编码
name = URLEncoder.encode(filename, "UTF-8");
}
System.out.println("编码后的内容:"+name);
// 设置第二个头
response.setHeader("content-disposition", "attachment;filename="+name);
// 一个流,先获取到要下载的文件的输入流,使用response对象的输出流输出到客户端上,完成文件下载了
// 先获取到要下载的文件的输入流,先获取到download文件夹 + filename 文件,获取文件的输入流了
String path = this.getServletContext().getRealPath("/download");
// System.out.println(path);
// 获取文件的输入流
InputStream in = new FileInputStream(path+"/"+filename);
// 获取输出流,不能new,使用response对象
OutputStream os = response.getOutputStream();
byte [] b = new byte[1024];
int len = 0;
while((len = in.read(b)) != -1){
os.write(b, 0, len);
}
in.close();
os.close();
}
/**
* 传入文件的名称,进行Base64编码
* @param fileName
* @return
*/
public 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);
}
}
标签:文件下载
原文地址:http://blog.51cto.com/13579086/2083303