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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...