文件下载的实质:就是发送二进制类型的响应体
代码:
@WebServlet("/download.do")
public class DoDownload extends HttpServlet {
private static final long serialVersionUID = 1L;
public DoDownload() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//指定文件格式
response.setContentType("application/pdf");
ServletContext context = getServletContext();
String downName = request.getParameter("file");
//为了提示保存,防止浏览器直接打开文件,设置响应头;downName为建议保存的文件名
response.setHeader("Content-Disposition", "attachment;filename="+downName);
//读取文件
InputStream iStream = context.getResourceAsStream(downName);
int read = 0;
byte[] bytes = new byte[1024];
OutputStream outputStream = response.getOutputStream();
while((read= iStream.read(bytes))!=-1){
outputStream.write(bytes,0,read);
}
outputStream.flush();
outputStream.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
html文件中
<a href ="download.do?file=2015.pdf">点击下载</a>
2015.pdf是我要上传的文件
这个文件一般放在webcontent文件夹下
Content-Disposition 的作用
当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。
注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。
详见:参考资料
ServletResponse输出流
ServletResponse输出流为开发人员提供了两种输出流
ServletOutputStream : 输出字节
PrintWriter : 输出字符(PrintWriter 实际包装了ServletOutputStream并提供了较高级别的方法)
我们可以通过下面的方法获取输出流
response.getOutputStream() 获得ServletOutputStream 对象
response.getWriter() 获得PrintWriter 对象
OutputStream 方法总结
(1)输出数据
void write(int b)往流中写一个字节b
void write(byte b[])往流中写一个字节数组b
void write(byte b[],int off,int len)把字节数组b中从下标off开始,长度为len的字节写入流中
(2)
flush()刷空输出流,并输出所有被缓存的字节
由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
(3)关闭流
close()流操作完毕后必须关闭。