使用HttpServletResponse從tomcat下載文件


隨便找一些文件,放在一個文件夾中(我的叫做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

感謝寫這篇文章的殘星大佬,寫的真的很詳細。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM