文件下载
HTML File
<body>
<a href="/Test/DownloadFile?filename=pvp.png">download picture</a><br/>
<a href="/Test/DownloadFile?filename=1.avi">download video</a>
</body>
中文文件名
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;
}
}
Servlet File
@WebServlet("/DownloadFile")
public class DownloadFile extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadFile() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// 设置统一编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获取文件名称
String file = request.getParameter("filename");
// 找到文件服务器路径
ServletContext servletContext = request.getServletContext();
String realPath = servletContext.getRealPath(file);
// 字节流加载文件
InputStream fileInputStream = new FileInputStream(realPath);
// 设置响应类型 content-type
String mimeType = servletContext.getMimeType(file);
response.setHeader("content-type", mimeType);
// 使用响应头设置请求方式
// 中文问题
Stirng agent = request.getHeader("user-agent");
String fileName = DownloadUtils.getFileName(agent,file);
response.setHeader("content-disposition", "attachment;filename=" + fileName);
// 输入流数据写到输出流
ServletOutputStream outputStream = response.getOutputStream();
int len;
byte[] buff = new byte[1024];
while ((len = fileInputStream.read(buff)) != -1) {
// response 输出流
outputStream.write(buff, 0, len);
}
fileInputStream.close();
outputStream.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}