<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
    jsp中實現文件下載

    (一)
    最簡單的方式是在網頁上做超級鏈接,如:<a href="music/abc.mp3">點擊下載</a>。
    但是這樣服務器上的目錄資源會直接暴露給最終用戶,會給網站帶來一些不 安全的因素。

    因此可以采用其它方式實現下載,可以采用:

    1、RequestDispatcher的方式進行;

    2、采用文件流輸出的方式下載。 (推薦)



    1、采用RequestDispatcher的方式進行

    Jsp代碼 復制代碼
    1. <%   
    2.   response.setContentType("application/x-download");//設置為下載application/x-download   
    3.   String filedownload = "/要下載的文件名";//即將下載的文件的相對路徑   
    4.   String filedisplay = "最終要顯示給用戶的保存文件名";//下載文件時顯示的文件保存名稱   
    5.   String filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");   
    6.   response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);   
    7.       
    8.   try   
    9.   {   
    10.   RequestDispatcher dis = application.getRequestDispatcher(filedownload);   
    11.   if(dis!= null)   
    12.   {   
    13.   dis.forward(request,response);   
    14.   }   
    15.   response.flushBuffer();   
    16.   }   
    17.   catch(Exception e)   
    18.   {   
    19.   e.printStackTrace();   
    20.   }   
    21.   finally   
    22.   {   
    23.       
    24.   }   
    25. %>  


    2、采用文件流輸出的方式下載

    Jsp代碼 復制代碼
    1. <%@page language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%>   
    2. <%   
    3.   //關于文件下載時采用文件流輸出的方式處理:   
    4.   //加上response.reset(),并且所有的%>后面不要換行,包括最后一個;   
    5.   
    6.   response.reset();//可以加也可以不加   
    7.   response.setContentType("application/x-download");   
    8.   
    9. //application.getRealPath("/main/mvplayer/CapSetup.msi");獲取的物理路徑   
    10.   
    11. String filedownload = "想辦法找到要提供下載的文件的物理路徑+文件名";   
    12.  String filedisplay = "給用戶提供的下載文件名";   
    13.   String filedisplay = URLEncoder.encode(filedisplay,"UTF-8");   
    14.   response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);   
    15.   
    16.   java.io.OutputStream outp = null;   
    17.   java.io.FileInputStream in = null;   
    18.   try   
    19.   {   
    20.   outp = response.getOutputStream();   
    21.   in = new FileInputStream(filenamedownload);   
    22.   
    23.   byte[] b = new byte[1024];   
    24.   int i = 0;   
    25.   
    26.   while((i = in.read(b)) > 0)   
    27.   {   
    28.   outp.write(b, 0, i);   
    29.   }   
    30. //     
    31. outp.flush();   
    32. //要加以下兩句話,否則會報錯   
    33. //java.lang.IllegalStateException: getOutputStream() has already been called for //this response     
    34. out.clear();   
    35. out = pageContext.pushBody();   
    36. }   
    37.   catch(Exception e)   
    38.   {   
    39.   System.out.println("Error!");   
    40.   e.printStackTrace();   
    41.   }   
    42.   finally   
    43.   {   
    44.   if(in != null)   
    45.   {   
    46.   in.close();   
    47.   in = null;   
    48.   }   
    49. //這里不能關閉     
    50. //if(outp != null)   
    51.   //{   
    52.   //outp.close();   
    53.   //outp = null;   
    54.   //}   
    55.   }   
    56. %>  

    對于第二種方法,我認為應該是比較常用的。不過有幾個地方是值得我們注意的:

    一、采用第二種方法的主要優點是實際文件的存放路徑對客戶端來說是透明的。
    這個文件可以存在于任何你的服務器能夠取得到的地方,而客戶端不一定能直接得到。例如文件來自于數據庫或者內部網絡的一個FTP服務器。還句話說,這種方式可以實現隱藏實際文件的URL地址。

    二、為了防止客戶端瀏覽器直接打開目標文件(例如在裝了MS Office套件的Windows中的IE瀏覽器可能就會直接在IE瀏覽器中打開你想下載的doc或者xls文件),你必須在響應頭里加入強制下載的MIME類型:
    response.setContentType("application/force-download");//設置為下載application/force-download
    這樣,就可以保證在用戶點擊下載鏈接的時候瀏覽器一定會彈出提示窗口來詢問你是下載還是直接打開并允許你選擇要打開的應用程序,除非你設置了瀏覽器的一些默認行為。
    或者,你想讓客戶端自行處理各種不同的文件類型,你可以在服務器的配置文件中配置MIME類型映射,通過簡單的判斷文件后綴名來處理。例如,在Tomcat中設置MIME響應類型:
    如果文件在客戶端中的響應程序類型和期望不一致,修改$TOMCAT_HOME\conf\web.xml文件中的如下部分 :
    <mime-mapping>
      <extension>zip</extension>
      <mime-type>application/zip</mime-type>
    </mime-mapping>
    <mime-mapping>
      <extension>mht</extension>
      <mime-type>message/rfc822</mime-type>
    </mime-mapping>
    ……

    三、在響應頭中盡量不要設置瀏覽器緩存期限。
    有時候用戶在點擊了下載鏈接后,在彈出窗口中,用戶想直接點擊“打開”,而不想保存到指定路徑。這時候如果我們在響應頭中限制了不允許使用瀏覽器緩存(即總是刷新),在IE瀏覽器中我們將無法直接打開該文件。因為限制了不允許使用緩存,瀏覽器無法將文件保存到臨時文件夾(即緩存)。
    也就是說,在響應頭中不要進行如下的設置(已注釋):
      //response.addHeader("pragma","NO-cache");
      //response.addHeader("Cache-Control","no-cache");
      //response.addDateHeader("Expries",0);

    四、文件名為中文或其他unicode字符時的處理。
    有時候提供下載的文件名中包含中文字符或者其他unicode字符,會導致瀏覽器無法正確的采用默認的文件名保存文件。我們應該記住在響應頭中包含filename字段并采用ISO8859-1編碼(推薦)或者采用UTF-8編碼:
    response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("UTF-8"),"iso8859-1")); //采用ISO8859-1編碼
    response.setHeader("Content-disposition","attachment; filename="+URLEncoder.encode(filename, "UTF-8")); //采用UTF-8編碼
    但是,這種方式在不同的瀏覽器中表現也有所不同。例如在IE和Firefox中,采用ISO8859-1編碼可以正確顯示文件名,而在Opera中不管采用那種編碼,默認保存的文件名都無法做到正確顯示。
    所以最好的方法其實就是盡量在文件名中使用ascii編碼。

    五、由于采用流的方式進行輸入輸出,我們必須保證在使用完畢后關閉流的資源。
    一般我們把關閉流的操作放在finally塊中,以保證在程序段結束前一定會關閉流的資源:

    InputStream is = null;
    ServletOutputStream sos = null;
    try {
      is = ...; //通過某種方式讀進數據到輸入流
      sos = response.getOutputStream(); //打開輸入流
      byte[] buff = new byte[2048];
      int bytesRead;
      while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
      sos.write(buff,0,bytesRead);
      sos.flush();
      }
    } catch(IOException ex) {
      //TODO something with IOException
    } catch(Exception ex) {
      //TODO something with Exception
    } finally {
      if(is != null) {
      is.close(); //關閉輸入流
      }
      if(sos != null) {
      sos.close(); //關閉輸入流
      }
    }
    posted on 2010-01-18 13:30 小菜毛毛 閱讀(327) 評論(0)  編輯  收藏 所屬分類: J2EE相關技術與框架
    主站蜘蛛池模板: 中文字幕免费在线观看动作大片 | 亚洲人成人网毛片在线播放| 黄瓜视频影院在线观看免费| 亚洲av无码成人影院一区| 国产亚洲色婷婷久久99精品91| 久久久久久毛片免费播放| 亚洲AV无码专区亚洲AV桃| 亚洲va久久久噜噜噜久久男同 | 久久亚洲AV成人无码电影| 免费黄色毛片视频| 精品视频在线免费观看| 亚洲国产精品18久久久久久| 亚洲阿v天堂在线| 白白国产永久免费视频| 性xxxxx大片免费视频| 羞羞视频免费网站含羞草| 亚洲欧洲日韩在线电影| 亚洲色成人中文字幕网站 | 国产成人毛片亚洲精品| 西西大胆无码视频免费| 免费看成人AA片无码视频吃奶| 国产午夜亚洲精品| 久久精品亚洲中文字幕无码麻豆| 免费成人av电影| 国产成人A在线观看视频免费 | 2022久久国产精品免费热麻豆| 永久免费无码日韩视频| 亚洲夂夂婷婷色拍WW47| 亚洲av伊人久久综合密臀性色| 亚洲成年人啊啊aa在线观看| 99国产精品永久免费视频| 精品在线免费观看| 黄网站色视频免费观看45分钟| 亚洲va久久久久| 亚洲精品中文字幕无乱码| 亚洲精品无码成人AAA片| 四虎国产精品免费视| 最近中文字幕免费mv视频7| 最近2022中文字幕免费视频| 日本视频在线观看永久免费 | 免费一级毛片免费播放|