随便找一些文件,放在一个文件夹中(我的叫做download),然后复制粘贴到项目文档中
可以看到,我在里面放了一些文件:a.jpg,b.txt和c.zip
接下来,写一个简单的html文件,作为页面展示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>资源预览</h1><br> <a href="download/a.jpg">攻略.jpg</a> <a href="download/b.txt">歌词.txt</a> <a href="download/c.zip">压缩包.zip</a><br> <h1>资源下载</h1><br> <a href="DownloadServlet?filename=a.jpg">攻略.jpg</a> <a href="DownloadServlet?filename=b.txt">歌词.txt</a> <a href="DownloadServlet?filename=c.zip">压缩包.zip</a> </body> </html>
资源预览块可以通过默认的DefaultServlet对文件进行查看,只需要资源预览的html代码运行即可进行查看,这个不多说,下面说下如何自己写Servlet实现下载。
拿a.jpg的下载链接来说:
在超链接标记中写入实现下载的Servlet的名称(很显然我的叫做DownloadServlet),用?号作为连接符给servlet传过去filename=文件名
然后就是编写Servlet了,继续拿a.jpg来说,代码如下:
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants; //HttpServletRespose下载文件 @WebServlet("/DownloadServlet") public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取要下载的文件名 -- 如:a.jpg String filename = request.getParameter("filename"); //2.获取这个文件在tomcat服务器下的绝对路径(点击攻略.jpg即a.jpg后获取到的路径为:D:\eclipse-jee-luna-jdk8-tomcat8\eclipse-jee-luna-jdk8-tomcat8\tomcat-8.0.21\webapps\WebProjectTest\download\a.jpg) String path = this.getServletContext().getRealPath("/download/" + filename); //3.浏览器收到资源时,以下载的方式提醒用户,而不是直接展示。关于getHeader的使用,下方有链接 response.setHeader("Content-Disposition", "attachment;filename=" + filename); //4.转化为输入流 InputStream is= new FileInputStream(path); //5.创建输出流 OutputStream os = response.getOutputStream(); //6.读写数据 int len; byte[] bys = new byte[1024]; while((len = is.read(bys)) != -1){ os.write(bys, 0, len); } os.close(); is.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
运行tomcat,打开页面后点击下载链接,即可发现点击链接后不再自动查看文件了,而是弹出浏览器的下载框。
其实这些代码中,需要注意的地方就是getServletContext().getRealPath()的用法以及response.setHeader()的用法,前者自己试着获取输出一下很容易明白,setHeader的作用较多,不多说了,给一个链接有兴趣的可以自己去看下,setHeader的用法非常全,下面是链接:
https://www.cnblogs.com/mingforyou/p/3281945.html
感谢写这篇文章的残星大佬,写的真的很详细。