title: 实现在网页上下载文件
date: 2015-12-28 20:34:19
categories: UtilsClass_Resource
tags: Utils
xl_echo编辑整理,欢迎转载,转载请声明文章来源。更多案例、资料请联系QQ:1280023003
实现在网页上下载文件
方式一:
超链接直接将文件的路径写到超链接的href中,只要浏览器不支持打开该文件,就会下载
方式二:
编写代码的方式完成文件的下载
设置两个头和一个流:
Content-Type:文件的MIME的类型
Content-Disposition:以下载的形式打开文件
InputStream:文件的输入流解决中文乱码问题
解决从浏览器输入乱码问题:String filename = new String(request.getParameter(“filename”).getBytes(“ISO-8859-1”),”UTF-8”);
解决向浏览器输出乱码问题:1、先了解用户使用的是什么浏览器:String agent = request.getHeader(“User-Agent”);
if(agent.contains(“Firefox”)){
filename = base64EncodeFileName(filename);
}else{//如果不是火狐
filename = URLEncoder.encode(filename,”UTF-8”);
}
再设置输出头部分response.setHeader("Content-Disposition", "attachment;filename="+filename);
实现代码
javaServlet部分
package user_servlet;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
public class User_Download_Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//文件下载,获取用户点击的文件名
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
//设置Content-Type
String type = this.getServletContext().getMimeType(filename);//获取需要下载文件的类型,用来设置响应头的信息
response.setHeader("Content-Type", type);
//获取全路径名,用于流读取文件
String RealPath = this.getServletContext().getRealPath("/Download/"+filename);
//处理浏览器的乱码为题
//查看用户使用的是什么浏览器
String agent = request.getHeader("User-Agent");
if(agent.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{//如果不是火狐
filename = URLEncoder.encode(filename,"UTF-8");
}
//设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//获取一个字节输入流
InputStream is = new FileInputStream(RealPath);
//获取输出流
ServletOutputStream outputStream = response.getOutputStream();
//向用户传送数据
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b)) != -1){
outputStream.write(b,0,len);
}
is.close();
}
//解决火狐浏览器的乱码问题专属代码
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
HTML部分
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>超链接下载方式</h1>
<a href="/shopping/Download/[牛人]TF家族 王俊凯王源 洋葱 超清.mp4">文本文件</a>
<a href="/shopping/Download/博客登录文件.txt">图片文件</a>
<a href="/shopping/Download/鉴赏 (7).jpg">压缩包文件</a>
<a href="/shopping/Download/hexo-theme-tranquilpeak-master.zip">视频文件</a>
<h1>手动编码方式下载</h1>
<a href="/shopping/User_Download_Servlet?filename=aaa.mp4">aaa.mp4</a>
<a href="/shopping/User_Download_Servlet?filename=hexo-theme-tranquilpeak-master.zip">hexo-theme-tranquilpeak-master.zip</a>
<a href="/shopping/User_Download_Servlet?filename=鉴赏 (7).jpg">鉴赏 (7).jpg</a>
<a href="/shopping/User_Download_Servlet?filename=博客登录文件.txt">博客登录文件.txt</a>
</body>
</html>