文件下载第一种方式--超链接下载
在jsp页面上有三个<a>标签
<a>标签中href的路径直接就是服务器中文件的路径,这些文件都是在day10项目中的download目录下
<a href="/day10/download/1.gif">1.gif</a><br/>
<a href="/day10/download/day10.txt">day10.txt</a><br/>
<a href="/day10/download/day10.doc">day10.doc</a><br/>
点击<a>标签,浏览器就会解析,能解析的他就会默认打开,不能解析的就会弹出下载,就能把文件下载过来
文件下载第二种方式--编码下载
同样在jsp页面上有这三个<a>标签
但这三个<a>标签的href发生了变化,在路径后面加了个name参数
<a href="/day10/download?name=1.gif">1.gif</a><br/>
<a href="/day10/download?name=day10笔记.txt">day10笔记.txt</a><br/>
<a href="/day10/download?name=day10.doc">day10.doc</a><br/>
然后在download这个servlet类中获取参数以及设置两个头一个流
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import com.itheima.utils.DownLoadUtils;
/**
* 文件下载
*/
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取下载文件的名称
String filename = request.getParameter("name");
//注意中文乱码
filename=new String(filename.getBytes("iso8859-1"),"utf-8");
ServletContext context = this.getServletContext();
//文件下载
//1.设置文件的mimeType
String mimeType = context.getMimeType(filename);
response.setContentType(mimeType);
//2.设置下载的头信息
String _filename=DownLoadUtils.getName(request.getHeader("user-agent"), filename);
response.setHeader("content-disposition", "attachment;filename="+_filename);
//获取输入流
InputStream is = context.getResourceAsStream("/download/"+filename);
//获取输出流
ServletOutputStream os = response.getOutputStream();
int len=-1;
byte[] b=new byte[1024];
while((len=is.read(b))!=-1){
os.write(b, 0, len);
}
os.close();
is.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
文件名字乱码问题使用的工具类
import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import sun.misc.BASE64Encoder; public class DownLoadUtils { public static String getName(String agent, String filename) throws UnsupportedEncodingException { if (agent.contains("MSIE")) { // IE浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); } return filename; } }