JavaEE实现文件下载
2023-06-13 09:15:29 时间
我们先来看一个最简单的文件下载的例子:
packagecom.yyz.response;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//文件下载
publicclassResponseDemoextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
Stringrealpath=this.getServletContext().getRealPath("/download/1.gif");
Stringfilename=realpath.substring(realpath.lastIndexOf("\\")+1);
response.setHeader("content-disposition","attachment;filename="+filename);
//服务器通过这个头,告诉浏览器以下载方式打开数据
FileInputStreamin=newFileInputStream(realpath);
intlen=0;
bytebuffer[]=newbyte[1024];
OutputStreamout=response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
//out不用close,response在销毁的时候服务器会自动关闭与response相关的流。
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
该段代码的功能是从服务器端下载图片1.png。目录结构用MyEclipse的packageexplorer显示如下:
让我们增加一点难度,我们要下载的文件是一个中文名字的文件。由于在http协议中头文件中的东西只能是ASCII字符,因而通过上述方式(直接将 Stringrealpath=this.getServletContext().getRealPath("/download/1.gif");改为 Stringrealpath=this.getServletContext().getRealPath("/download/图片.gif");)直接拿文件,
会出现乱码问题。附上测试结果:
要解决这个问题,要用到URLEncoder类的encode方法:
packagecom.yyz.response;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.net.URLEncoder;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
//中文文件下载时,中文文件名要经过URL编码。
publicclassResponseDemoextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
Stringrealpath=this.getServletContext().getRealPath("/download/图片.gif");
Stringfilename=realpath.substring(realpath.lastIndexOf("\\")+1);
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//本函数将字符串以URL编码
FileInputStreamin=newFileInputStream(realpath);
intlen=0;
bytebuffer[]=newbyte[1024];
OutputStreamout=response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
附上测试结果:
另外这里有一个小细节需要大家注意:
不能用FileReader代替FileInputStream。用FileReader会丢失数据,原因是这样的:FileReader是字符流,而图片,媒体文件等的数据都是以01的方式存储,用FileReader读的时候需要查阅一个编码表,如果未指定一种编码,则使用相应平台的默认编码。如在中国的电脑就会去查GB2312。当读到GB2312码表中不存在的编码时,会将该数据编码成"?",结束后数据就变成中文和"?"的混合。发到客户端后显示时再次查阅码表,将所有的"?"替换成"?"的编码,就会丢失数据。向这种细节只需要记住一点:字节流可以处理任意类型的数据,字符流只能处理字符数据。
相关文章
- 用Java IO流实现下载文件
- java 下载文件
- JSP的文件上传和下载
- python通过pysftp加密上传、下载ftp服务器文件详解编程语言
- 文件下载java实现代码详解编程语言
- Android多线程实现文件断点下载详解编程语言
- 用Servlet把文件写到Respond输出流里面供用户下载详解编程语言
- 文件Linux服务器实现快速文件下载(linux服务器下载)
- Oracle网盘新体验:高速下载分享文件(oracle网盘下载)
- [下载] 各种软件找不到DLL文件?你需要安装最新的微软运行库合集
- 掌握Linux下wget指令,手把手教你简单粗暴下载文件!(linux下wget)
- 轻松下载Linux版QQ,快速便捷获取文件(qqlinux下载文件)
- Linux ZIP 命令:快捷文件打包下载(linux zip 命令)
- 用asp实现文件浏览、上传、下载的程序
- php实现文件下载更能介绍
- asp.netC#实现下载文件的六种方法实例
- ASP.NET在下载文件时对其重命名的思路及实现方法
- php读取csv实现csv文件下载功能
- 用JS在浏览器中创建下载文件
- php实现批量下载百度云盘文件例子分享