随便找一些文件,放在一个文件夹中(我的叫做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

感谢写这篇文章的残星大佬,写的真的很详细。