JavaEE实现文件下载
程序员文章站
2024-03-31 15:30:28
我们先来看一个最简单的文件下载的例子:
复制代码 代码如下:
package com.yyz.response;
import j...
我们先来看一个最简单的文件下载的例子:
复制代码 代码如下:
package com.yyz.response;
import java.io.fileinputstream;
import java.io.ioexception;
import java.io.outputstream;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
//文件下载
public class responsedemo extends httpservlet {
public void doget(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
string realpath = this.getservletcontext().getrealpath("/download/1.gif");
string filename = realpath.substring(realpath.lastindexof(");
response.setheader("content-disposition", "attachment;filename="+filename);
//服务器通过这个头,告诉浏览器以下载方式打开数据
fileinputstream in = new fileinputstream(realpath);
int len = 0;
byte buffer[]=new byte[1024];
outputstream out = response.getoutputstream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
//out不用close,response在销毁的时候服务器会自动关闭与response相关的流。
}
public void dopost(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
doget(request,response);
}
}
该段代码的功能是从服务器端下载图片1.png。目录结构用myeclipse的package explorer显示如下:
让我们增加一点难度,我们要下载的文件是一个中文名字的文件。由于在http协议中头文件中的东西只能是ascii字符,因而通过上述方式(直接将 string realpath = this.getservletcontext().getrealpath("/download/1.gif");改为 string realpath = this.getservletcontext().getrealpath("/download/图片.gif");)直接拿文件,
会出现乱码问题。附上测试结果:
要解决这个问题,要用到 urlencoder类的encode方法:
复制代码 代码如下:
package com.yyz.response;
import java.io.fileinputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.net.urlencoder;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
//中文文件下载时,中文文件名要经过url编码。
public class responsedemo extends httpservlet {
public void doget(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
string realpath = this.getservletcontext().getrealpath("/download/图片.gif");
string filename = realpath.substring(realpath.lastindexof(");
response.setheader("content-disposition", "attachment;filename="+urlencoder.encode(filename,"utf-8"));
//本函数将字符串以 url 编码
fileinputstream in = new fileinputstream(realpath);
int len = 0;
byte buffer[]=new byte[1024];
outputstream out = response.getoutputstream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
}
public void dopost(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
doget(request,response);
}
}
附上测试结果:
另外这里有一个小细节需要大家注意:
不能用filereader代替fileinputstream。用filereader会丢失数据,原因是这样的:filereader是字符流,而图片,媒体文件等的数据都是以01的方式存储,用filereader读的时候需要查阅一个编码表,如果未指定一种编码,则使用相应平台的默认编码。如在中国的电脑就会去查gb2312。当读到gb2312码表中不存在的编码时,会将该数据编码成'?',结束后数据就变成中文和'?'的混合。发到客户端后显示时再次查阅码表,将所有的'?'替换成'?'的编码,就会丢失数据。向这种细节只需要记住一点:字节流可以处理任意类型的数据,字符流只能处理字符数据。
下一篇: 删除MySQL重复数据的方法