今天项目中实现一个servlet下载文件的功能,保存文件时,文件名出现异常。
研究了一下,做下记录。
servlet代码:
package com.my.servlet;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = getServletContext().getRealPath("/") + "/doc";
String fileName =java.net.URLDecoder.decode(request.getParameter("filename"),"UTF-8");
File file = new File(path + "/" + fileName);
// 如果文件存在
if (file.exists()) {
// 设置响应类型及响应头
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ new String(fileName.getBytes(),"iso8859-1") + "\"");
// 读取文件
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(inputStream);
byte[] bytes = new byte[1024];
ServletOutputStream outStream = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outStream);
int readLength = 0;
while ((readLength = bis.read(bytes)) != -1) {
bos.write(bytes, 0, readLength);
}
// 释放资源
inputStream.close();
bis.close();
bos.flush();
outStream.close();
bos.close();
} else {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("文件不存在!");
return;
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
前端代码:
<script type="text/javascript">
<!--
function down(){
location.href="down.servlet?filename="+encodeURI(encodeURI('JavaSwing中文.chm'));
}
//-->
</script>
//java后台解码
String fileName =java.net.URLDecoder.decode(request.getParameter("filename"),"UTF-8");
//设置浏览器输出编码
response.setHeader("Content-Disposition", "attachment; filename=\""
+ new String(fileName.getBytes(),"iso8859-1") + "\"");