大家好,首先我先给大家分析一下步骤。第一步为前台操作,从第二步开始全是后台servlet操作
步骤:
1.定义前台页面,href属性,指向Servlet
<a href="/ESMS/downLoadServlet?filename=下载.jpg">图片1</a>
2在后台定义servlet
2.1获取文件名
String filename=request.getParameter("filename");
2.2使用字节输入流加载文件进入内存中
2.2.1找到图片真实路径
ServletContext context=this.getServletContext();
String realpath=context.getRealPath("/image/"+filename);
2.2.2用字节流关联数据
FileInputStream fis=new FileInputStream(realPath);
2.3指定response响应头
2.3.1设置响应头类型
String mimeType=servletContext.getMineType(filename);
response.setHeader("content-type",mimeType);
2.3.2设置响应头打开方式,并解决中文文件名问题(使用了一个工具类,会在末尾附上)
获取user-agent请求头
String agent=request.getHeader("user-agent");
使用工具类方法编码文件名
filename=DownLoadUtils.getFileName(agent,filename);
response.setHeader("content-disposition","attachment;filename="+filename);
2.4将数据写出到response输出流,并释放资源
ServletOutputStream sos=response.getOutputStream();
//定义缓冲区
byte[] buff=new byte[1024*8];
//定义流长 初始为0
int len=0;
while ((len=fis.read(buff))!=-1){
sos.write(buff,0,len);
}
//释放资源
fis.close();
Download工具类代码:作用是解决文件名是中文的问题
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}