- _nosay
Servlet文件下载
2017-11-20 15:25:56
前文学了response有两个输出的方式,分别是
response.getWriter();//输出字节码文件的
response.getOutputStream();//输出二进制文件的
而读取文件,我们需要new一个FileInputStream
首先建立一个DownServlet文件,相关代码如下:
package com.nosay.servlet; 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; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @WebServlet(name = "DownloadlServlet",urlPatterns = "/download") public class DownloadlServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getParameter("filename"); String realPath = this.getServletContext().getRealPath("download/" + filename); InputStream in = new FileInputStream(realPath); ServletOutputStream outputStream = response.getOutputStream(); //文件拷贝 int len = 0; byte[] buffer = new byte[1024]; while ((len=in.read(buffer)) > 0) { outputStream.write(buffer,0,len); } in.close(); } }
此时我们在根目录建立一个download文件夹,在里面建立aa.txt文本文件,内容为hello
然后访问一下http://localhost:8080/download?filename=aa.txt
此链接
成功得到了aa.txt中的内容,hello
如何不在浏览器中查看,而是直接下载此txt文件呢?
此时我们需要一个响应头来通知浏览器直接下载
1.通过文件输入输出流将文件返回给客户端浏览器.
2.通过对应的http响应头通知浏览器下载该文件.
告知浏览器文件的类型:response.setContentType(文件的MIME)类型
告知浏览器文件的打开方式是下载
response.setHeader("Content-Disposition","attachment;filename=文件名称")
相关代码
package com.nosay.servlet; 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; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @WebServlet(name = "DownloadlServlet",urlPatterns = "/download") public class DownloadlServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getParameter("filename"); String mimeType = this.getServletContext().getMimeType(filename); response.setContentType(mimeType); response.setHeader("Content-Disposition","attachment;filename="+filename); String realPath = this.getServletContext().getRealPath("download/" + filename); InputStream in = new FileInputStream(realPath); ServletOutputStream outputStream = response.getOutputStream(); //文件拷贝 int len = 0; byte[] buffer = new byte[1024]; while ((len=in.read(buffer)) > 0) { outputStream.write(buffer,0,len); } in.close(); } }