首先是JSP页面,得提供一个下载的连接
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/DemoTest/Download?filename=1.png">下载</a>
</body>
</html>
然后是后台下载,注释都在下面:关键就是设置两个头和一个流
package mine.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Download")
public class Download extends HttpServlet {
private static final long serialVersionUID = 1L;
public Download() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//注意,这里的第一句话是servlet自动生成的,如果response既getwriter又getoutpustream的话就会出现
//java.lang.IllegalStateException: getWriter() has already been called for this response
//response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("执行了");
//获取文件的名字
String filename=request.getParameter("filename");
System.out.println(filename);
//获取文件在服务器中的路径
String path=getServletContext().getRealPath("/upload");
System.out.println(path);
//获取文件的输入流
InputStream in=new FileInputStream(path+"/"+filename);
//设置连个头信息
String type=getServletContext().getMimeType(filename);
response.setContentType(type);
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//获取输出流并进行读写操作
ServletOutputStream os=response.getOutputStream();
int len=0;
byte[] b=new byte[1024];
while((len=in.read(b))!=-1) {
os.write(b,0,len);
}
in.close();
os.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}