解决下载中文名文件的问题。
首先我们要知道下载文件的步骤,然后我们才能写代码。
- 获取下载文件的路径;下载的文件名是?设置想办法让浏览器能够支持下载我们需要的东西;获取文件下载的输入流;创建缓冲区;获取OutputStream对象;将FileOutputStream流写入到buffer缓冲区;使用OutputStream将缓冲区中的数据输出到客户端;
Java核心代码:
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取下载文件的路径
String realPath = "C:\Users\84806\IdeaProjects\javaweb-02-servlet\response\src\main\resources\我的电脑.png";
System.out.println("下载文件的路径:"+realPath);
// 2.下载的文件名是?
String filename = realPath.substring(realPath.lastIndexOf("\") + 1);
// 3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名为 URLEncoder.encode 编码,否则有可能乱码
resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
// 4.获取文件下载的输入流
FileInputStream in = new FileInputStream(realPath);
// 5.创建缓冲区
int len;
byte[] buffer = new byte[1024];
// 6.获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
// 关闭流
in.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml文件下的配置:
filedown com.zhihua.servlet.FileServlet filedown /down
运行测试:
在运行成功的浏览器界面访问我们刚刚在xml文件里注册的down路径;
由于resources目录的文件名为中文,那么用户下载的时候如何获取中文名的文件呢?
只需要在设置头消息加上URLEncoder.encode(filename,"UTF-8"),就得以解决。



