來吧,教你JavaWeb中如何實現文件下載

本文做者:樂字節-坑王老薛html

來吧,教你JavaWeb中如何實現文件下載

文件下載的方式

  • 超連接下載
  • 後臺實現下載

案例實操

超連接下載

當咱們在 HTML 或 JSP 頁面中使用標籤時,原意是但願可以進行跳轉,但當超連接遇到瀏覽器不識別的動態網頁時則會自動下載。若是瀏覽器遇到可以直接顯示的資源,瀏覽器就會默認顯示出來,好比 txt,png,jpg 等。固然咱們也能夠經過 download 屬性規定瀏覽器進行下載。但有些瀏覽器並不支持。java

默認下載瀏覽器

<a href="upload/abc.zip">超連接下載</a>

指定 download 屬性下載服務器

<a href="upload/abc.txt" download="abcdef.txt">超連接下載</a>

這裏,download 也能夠不寫任何信息,會自動使用默認文件名。這樣當用戶打開瀏覽器點擊連接的時候就會直接下載文件。app

後臺實現下載

Step1:須要經過 HttpServletResponse.setContentType 方法設置 Content-type 頭字段的值,這樣瀏覽器纔可以使用某種方式或激活某個程序來處理相應 MIME 類型的數據,例 如 」application/octet-stream」 或 」application/x-msdownload」 等 ide

Step2:須要經過 HttpServletResponse.setHeader 方法設置 Content-Disposition 頭的值爲」attachment;filename=文件名」,filename提供了文件下載時的一個默認文件名post

Step3:讀取下載文件,調用 HttpServletResponse.getOutputStream 方法返回的OutputStream對象來向客戶端寫入附件內容。編碼

public class DownLoadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 設置請求編碼
        request.setCharacterEncoding("UTF-8");
        // 接受參數,獲得須要被下載的文件的名稱
        String fileName = request.getParameter("fileName");
        // 判斷名字名是否爲空
        if(fileName == null || "".equals(fileName)){
            // 提示
            System.out.println("文件名不能爲空");
            return;
        }
        // 獲取文件存放的真實路徑
        String path = request.getServletContext().getRealPath("/" + fileName);
        // 經過文件路徑和文件名獲得file對象
        File file = new File(path);
        // 判斷是否存在,而且是一個標準文件
        if (file.exists() && file.isFile()){
            // 設置相應類型 application/octet-stream
            response.setContentType("application/x-msdownload");
            // 設置頭信息
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 經過file對象獲得輸入流
            FileInputStream in = new FileInputStream(file);
            // 獲得輸出流
            ServletOutputStream out = response.getOutputStream();
            byte[] car = new byte[1024];
            int len = 0;
            while((len = in.read(car)) != -1){
                out.write(car,0,len);
            }
            // 關閉流
            in.close();
            out.close();
        } else {
            System.out.println("文件路徑不正確!");
        }

    }

}

擴展~HTML表單編碼

HTML表單編碼

enctype屬性指定瀏覽器如何編碼數據並將其呈現給服務器。url

此屬性有三個容許值。code

  • application/x-www-form-urlencoded
    默認編碼。
    此編碼沒法用於將文件上傳到服務器。
  • multipart/form-data
    此編碼用於將文件上傳到服務器。
  • text/plain
    此編碼因瀏覽器而異。

要理解不一樣編碼的工做原理,咱們建立了如下形式。

<!DOCTYPE HTML>
<html>
<body>
  <form method="post" action="http://example.com/form">
    <input name="fave" /> 
    <input name="name" />
    <button>Submit Vote</button>
  </form>
</body>
</html>

application/x-www-form-urlencoded

若是使用application / x-www-form-urlencoded編碼,每一個數據項的名稱和值都使用用於編碼URL的相同方案進行編碼。這是編碼應用於示例形式的數據的方式:

fave=Apples&name=FiratName+LastName

特殊字符將替換爲其HTML實體對應部分。數據項的名稱和值由等號(=)分隔,數據/值元組由&符號(&)分隔。

multipart/form-data

multipart / form-data編碼每每僅用於上傳文件。下面是示例表單中的數據如何編碼:

------WebKitFormBoundary2desQWER543CDFGF

Content-Disposition: form-data; name="fave" YourName
------WebKitFormBoundary2desQWER543CDFGF Content-Disposition: form-data; name="name" www.lezijie.cn
------WebKitFormBoundary2desQWER543CDFGF-- fave=Apple
name=www.lezijie.cn

multipart/plain

主流瀏覽器以不一樣的方式對該編碼進行編碼。

Google Chrome以與application / x-www-form-urlencoded方案相同的方式對數據進行編碼,而Firefox對數據進行編碼的方式以下:

fave=xml
name=www.lezijie.cn

n

主流瀏覽器以不一樣的方式對該編碼進行編碼。

Google Chrome以與application / x-www-form-urlencoded方案相同的方式對數據進行編碼,而Firefox對數據進行編碼的方式以下:

fave=xml
name=www.lezijie.cn

每一個數據項都放在一行上,不會對特殊字符進行編碼。

相關文章
相關標籤/搜索