java文件下載

来源:http://www.cnblogs.com/lihaoyang/archive/2017/08/11/7348293.html
-Advertisement-
Play Games

文件下載,可以是post請求,也可以是get請求。 新建web項目,在WebRoot下建up目錄存放上傳的文件: 最簡單的但是實際不會這樣做的下載方式,直接用a標簽指向文件目錄,就能下載: 這樣能下載,但是任何人都能下載,你沒法做一些控制,比如只有登錄的用戶才能下載,積分不夠的人不能下載,而且,這樣 ...


文件下載,可以是post請求,也可以是get請求。

新建web項目,在WebRoot下建up目錄存放上傳的文件:

最簡單的但是實際不會這樣做的下載方式,直接用a標簽指向文件目錄,就能下載:

<a href="<c:url value='/up/a.jpg'/>">下載jpg</a>
    <br />
    <a href="<c:url value='/up/cos.jar'/>">下載jar</a>
    <br />
    <a href="<c:url value='/up/db.doc'/>">下載doc</a> 
    <br /> 
    <a href="<c:url value='/up/jingyesi.txt'/>">下載txt</a>  
    <br />
    <a href="<c:url value='/up/buystatus.xlsx'/>">下載excel</a> 

這樣能下載,但是任何人都能下載,你沒法做一些控制,比如只有登錄的用戶才能下載,積分不夠的人不能下載,而且,這樣做是有問題的,如果下載的文件瀏覽器能直接解析,就不會以附件形式下載,瀏覽器會直接打開,如圖片,txt文本,如果是在IE瀏覽器上,機器如果裝了office,IE還會讓你選擇是打開文件還是下載文件:

 

一般人從來不這麼乾,都得通過Servlet來下載,這樣你想咋控制你的下載條件就能控制了:

package com.lhy.upload;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 文件下載既可以是get請求也可以是post
 * @author Administrator
 *
 */
@WebServlet(name="DownServlet",urlPatterns="/DownServlet")
public class DownServlet extends HttpServlet{

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    String name = req.getParameter("name");//獲取要下載的文件名
    //第一步:設置響應類型
    resp.setContentType("application/force-download");//應用程式強制下載
    //第二讀取文件
    String path = getServletContext().getRealPath("/up/"+name);
    InputStream in = new FileInputStream(path);
    //設置響應頭,對文件進行url編碼
    name = URLEncoder.encode(name, "UTF-8");
    resp.setHeader("Content-Disposition", "attachment;filename="+name);   
    resp.setContentLength(in.available());
    
    //第三步:老套路,開始copy
    OutputStream out = resp.getOutputStream();
    byte[] b = new byte[1024];
    int len = 0;
    while((len = in.read(b))!=-1){
      out.write(b, 0, len);
    }
    out.flush();
    out.close();
    in.close();
  }

}

 註:resp.setContentType("application/force-download");//應用程式強制下載

以前也做過下載word,excel,網上說這個Content-Type設置這設置那的,記得當時就下載個excel、word還出這個那個問題,去還去百度修改這個Content-Type,不一樣的文件類型設置的還不一樣,統統的不需要,這裡只設置成 application/force-download,很管事,不管啥文件,不管你是word,excel還是啥的,統統的老實的給我下載。

還有 resp.setHeader("Content-Disposition", "attachment;filename="+name);   這個 attachment 意思就是附件,就是說如果是瀏覽器能直接解析的文件,比如圖片,你也老老實實以附件形式給我下載,別給我直接解析(IE除外,IE還會提示你讓你選擇打開還是下載)。

網上的一些說明:

Content-disposition 是 MIME 協議的擴展,MIME 協議指示 MIME 用戶代理如何顯示附加的文件。Content-disposition其實可以控制用戶請求所得的內容存為一個文件的時候提供一個預設的文件名,文件直接在瀏覽器上顯示或者在訪問時彈出文件下載對話框。 

格式說明: 
content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )   

 

欄位說明: 
Content-Disposition為屬性名 
disposition-type是以什麼方式下載,如attachment為以附件方式下載 
disposition-parm為預設保存時的文件名 
服務端向客戶端游覽器發送文件時,如果是瀏覽器支持的文件類型,一般會預設使用瀏覽器打開,比如txt、jpg等,會直接在瀏覽器中顯示,如果需要提示用戶保存,就要利用Content-Disposition進行一下處理,關鍵在於一定要加上attachment:


欄位說明: 
Content-Disposition為屬性名 
disposition-type是以什麼方式下載,如attachment為以附件方式下載 
disposition-parm為預設保存時的文件名 
服務端向客戶端游覽器發送文件時,如果是瀏覽器支持的文件類型,一般會預設使用瀏覽器打開,比如txt、jpg等,會直接在瀏覽器中顯示,如果需要提示用戶保存,就要利用Content-Disposition進行一下處理,關鍵在於一定要加上attachment:


欄位說明: 
Content-Disposition為屬性名 
disposition-type是以什麼方式下載,如attachment為以附件方式下載 
disposition-parm為預設保存時的文件名 
服務端向客戶端游覽器發送文件時,如果是瀏覽器支持的文件類型,一般會預設使用瀏覽器打開,比如txt、jpg等,會直接在瀏覽器中顯示,如果需要提示用戶保存,就要利用Content-Disposition進行一下處理,關鍵在於一定要加上attachment:

備註:這樣瀏覽器會提示保存還是打開,即使選擇打開,也會使用相關聯的程式比如記事本打開,而不是IE直接打開了。

那麼由上可知具體的例子: 

Content-Disposition: attachment; filename="filename.xls" 
當然filename參數可以包含路徑信息,但User-Agnet會忽略掉這些信息,只會把路徑信息的最後一部分做為文件名。當你在響應類型為application/octet- stream情況下使用了這個頭信息的話,那就意味著你不想直接顯示內容,而是彈出一個"文件下載"的對話框,接下來就是由你來決定"打開"還是"保存" 了。 



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • indows Azure能夠根據您企業的需求提供最適合的基礎結構,並且在業務發展或精簡時能夠根據變化的需求及時的做出改變。您可以將Windows Azure 基礎結構服務看作是您 “位於雲上的數據中心”。在Windows Azure上,您可以在幾分鐘內迅速的部署全新的虛擬機,並採用按用量付費的方式。... ...
  • 15.1 枚舉類型 枚舉定義的符號是常量值. C 編譯器編譯時,會用數值替換符號,不再引用定義了符號的枚舉類型.可能會出現一些版本問題. Enum.IsDefined(Type enumType, object value) 方法被經常用於參數校驗: IsDefined 方法必須慎用. 首先, Is ...
  • 前言:AutoMapper的下載安裝我就不多說了,網上百度一大堆。今天我就說說它的更為簡單的使用,什麼叫更為簡單呢?按照一般的使用方法,我們首先建DTO,然後建每個對應的Profile,然後還要把每個Profile給Initialize,最後Global里AutoMapper.Configurati ...
  • Windows Azure是微軟的雲平臺,可以提供廣泛服務。您可以通過它搭建、部署並管理解決方案,用於實現您可以想象的幾乎任何目標。換言之,WindowsAzure是擁有無限可能的世界。無論您是需要運行伺服器工作負載的橫跨廣闊地域的型企業,還是希望將網站面向各地都可以提供高速訪問的小型公司,Wind... ...
  • 為了讓廣大 IT 同胞度過一個美好的7天長假,小編今天特意為大家準備了一份IT人長假不加班正確姿勢指南,幫助大家實現長假我做主的美好願望。 ...
  • 題目背景 眾所周知,我們稱g是a的約數,當且僅當g是正數且a mod g = 0。 眾所周知,若g既是a的約數也是b的約數,我們稱g是a、b的一個公約數。 眾所周知,a、b最大的那個公約數就叫最大公約數。 題目描述 現在對於給定的兩個正整數a、b,你需要求出它們次大的公約數(second great ...
  • Python列表的增刪改查排 一、列表的樣子: a = [‘q’ , ’w’ , ’e ’, ’r’,‘t’] a為列表名,[ ]為列表內容,‘ ’為列表內的元素,‘q’為a[0] 二、查(也稱切片): print ( a[0] ) #取出列表中第一個元素 即:q print ( a[1:] ) # ...
  • JAVA記憶體模型: 堆區中 保存呢以new關鍵字創建出的對象 jdk1.7版本之後 字元串常量池也存放在堆區中 棧區中 保存臨時變數和參數,每個線程都有自己的棧,每調用一個方法創建一個棧針 方法區 靜態成員 類 方法等信息 調用方法的時候 如果參數是基本數據類型,那麼傳遞的是數值 如果參數是引用類型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...