方式一:超链接下载
如果文件格式浏览器识别,将直接打开文件,显示在浏览器上,这是可以右键另存下载。如果文件格式浏览器不识别,将弹出下载窗口。方式二:在服务器端编程完成下载。
超链接下载方式实例:
<a href=”某个资源连接”>名字</a>在服务器端编程完成下载实例:
public void doPost(HttpServletRequset request, HttpServletResponse response) throws ServletException,IOException{
//1.得到要下载的文件名称。
String filename = request.getParameter("filename");
//解决中文乱码问题。因为tomcat的默认的编码为ISO8859-1。转成UTF-8编码。
filename = new String(filename.getBytes["iso8859-1"],"UTF-8");
//2.在对应的目录下查找文件是否存在。
File file = new File("某个目录"+"/"+filename);
if(file.exists()){
//3.文件存在,进行对应操作。
//获取并设置下载文件的mimeType
String mimeType = this.getServletContext().getMimeType(filename);
response.setContentType(mimeType);
//因为不同浏览器下载时文件名字的编码不一样,所以要判断然后对应选择。
String agent = request.getHeader("user-agent");
if(agent.contains("MSIE"))
//如果是IE浏览器
filename = URLEncoder.encode(filename,"UTF-8");
else if(agent.contains("Firefox")){
//如果是火狐浏览器。
BASE64Encoder base64 = new BASE64Encoder();
filename="=?utf-8?B?"+base64.encode(filename.getBytes("UTF-8"))+"?=";
}else
//其他的浏览器。
filename = URLEncoder.encode(filename,"UTF-8");
//不管浏览器是否能解析,都进行下载处理。
response.setHeader("content-Disposition","attachement;filename="+filename);
//读取要下载的文件内容
FileInputStream fis = new FileInputStream(file);
//将要下载的文件内容通过流回写到客户端
OutputStream os = new response.getOutputStream();
int len = -1;
byte[] b = new byte[1024*1024];
while((fis.read(b))!=-1){
os.write(b,0,len);
os.flush();
}
//关闭资源。
os.close();
fis.close();
}else{
//抛出运行异常。
throw new RuntimeException("下载资源不存在!!!");
}
}
5 . 服务器端编程下载步骤:
<1>.下载的文件要通过response.getOutputStream()流,回写到客户端。
<2>.设置mimeType
<3>.设置响应头,不管浏览器是否能解析,都下载。
6.文件下载中出现乱码的问题:
<1>.关于下载时中文名称资源找不到的问题。
原因:超链接下载是get方式请求服务器。在服务器端中,
String filename = request.getParameter(“filename”);
解决方案:filename = new String(filename.getBytes(“iso5589-1”),”UTF-8”);
<2>.下载文件时,显示中文乱码问题。
原因: response.setHeader(“content-Disposition”,”attachement;filename=”+filename)中filename这个字符串会根据不同浏览器进行不同的编码,所以会显示乱码。
解决方法:因为filename在判断文件是否存在的时候,会用到,所以在判断存在之后,要根据不同浏览器对filename进行不同的编码。
if(agent.contains("MSIE"))
//如果浏览器是IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
else if(agent.contains("Firefox")){
//如果是火狐浏览器
BASE64Encoder base64 = new BASE64Encoder();
filename = "=?utf-8?B?"+base64.encode(filename.getBytes("UTF-8"))+"?=";
}else
filename = URLEncoder.encode(filename, "UTF-8");