Java快速開(kāi)發(fā)平臺(tái)

          www.fastunit.com

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            23 Posts :: 0 Stories :: 273 Comments :: 0 Trackbacks

          一、如何使用

          如果此Servlet命名為download,請(qǐng)求的URL為:/download?path=xxx,請(qǐng)求后出現(xiàn)下載窗口:

          download.gif

          二、源碼

          import java.io.BufferedInputStream;
          import java.io.BufferedOutputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;

          import javax.servlet.ServletException;
          import javax.servlet.ServletOutputStream;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          public class FileDownload extends HttpServlet {

            
          protected void service(HttpServletRequest req, HttpServletResponse res)
                
          throws ServletException, IOException {

              
          // 服務(wù)器相對(duì)路徑
              String path = req.getParameter("path");
              
          // 服務(wù)器絕對(duì)路徑
              path = getServletContext().getRealPath("/"+ path;

              
          // 檢查文件是否存在
              File obj = new File(path);
              
          if (!obj.exists()) {
                res.setContentType(
          "text/html;charset=GBK");
                res.getWriter().print(
          "指定文件不存在!");
                
          return;
              }

              
          // 讀取文件名:用于設(shè)置客戶端保存時(shí)指定默認(rèn)文件名
              int index = path.lastIndexOf("\\"); // 前提:傳入的path字符串以“\”表示目錄分隔符
              String fileName = path.substring(index + 1);

              
          // 寫(xiě)流文件到前端瀏覽器
              ServletOutputStream out = res.getOutputStream();
              res.setHeader(
          "Content-disposition""attachment;filename=" + fileName);
              BufferedInputStream bis 
          = null;
              BufferedOutputStream bos 
          = null;
              
          try {
                bis 
          = new BufferedInputStream(new FileInputStream(path));
                bos 
          = new BufferedOutputStream(out);
                
          byte[] buff = new byte[2048];
                
          int bytesRead;
                
          while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                  bos.write(buff, 
          0, bytesRead);
                }
              } 
          catch (IOException e) {
                
          throw e;
              } 
          finally {
                
          if (bis != null)
                  bis.close();
                
          if (bos != null)
                  bos.close();
              }
            }

          }

          三、web.xml配置

          <servlet>
              
          <servlet-name>FileDownload</servlet-name>
              
          <servlet-class>com.fastunit.test.FileDownload</servlet-class>
          </servlet>
          <servlet-mapping>
              
          <servlet-name>FileDownload</servlet-name>
              
          <url-pattern>/download</url-pattern>
          </servlet-mapping>

          四、補(bǔ)充說(shuō)明

          本例只是一個(gè)簡(jiǎn)單實(shí)現(xiàn),應(yīng)用時(shí)需要在實(shí)際環(huán)境中處理以下問(wèn)題:
          1. 權(quán)限問(wèn)題:結(jié)合實(shí)際系統(tǒng)增加用戶權(quán)限控制
          2. 中文文件名:中文問(wèn)題與運(yùn)行環(huán)境有關(guān),不同環(huán)境下解決方式也有差異,一般可通過(guò)轉(zhuǎn)碼來(lái)解決。
          3. 文件類(lèi)型:文件類(lèi)型統(tǒng)一時(shí)可直接指定,如res.setContentType("application/zip");文件類(lèi)型不確定時(shí)可不設(shè)、設(shè)一個(gè)不存在的、或通過(guò)解析文件名后綴來(lái)設(shè)置,以實(shí)際測(cè)試通過(guò)為準(zhǔn)。

          posted on 2008-01-22 14:26 FastUnit 閱讀(12020) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): Java

          Feedback

          # re: Servlet實(shí)現(xiàn)文件下載的源碼 2008-01-23 18:15 stoneshao
          需要修正的幾個(gè)地方:
          1。中文文件名亂碼
          2。mime的信息  回復(fù)  更多評(píng)論
            

          # re: Servlet實(shí)現(xiàn)文件下載的源碼 2008-01-24 19:39 FastUnit
          @stoneshao
          原文不夠嚴(yán)謹(jǐn),這兩點(diǎn)確實(shí)是關(guān)鍵之處,已根據(jù)你的提議在文中增加了補(bǔ)充說(shuō)明。  回復(fù)  更多評(píng)論
            

          # re: Servlet實(shí)現(xiàn)文件下載的源碼 2010-06-13 14:15 一個(gè)好人
          如果文件的大小超過(guò)50M,這個(gè)好像行不通吧  回復(fù)  更多評(píng)論
            

          # re: Servlet實(shí)現(xiàn)文件下載的源碼[未登錄](méi) 2014-03-18 13:32 java愛(ài)好者
          把流文件不寫(xiě)到前端瀏覽器而是用戶自己指定的文件如何改啊
          急求救
            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 北碚区| 固安县| 南汇区| 贵定县| 太和县| 东光县| 黑河市| 曲沃县| 涡阳县| 汉源县| 来宾市| 姚安县| 芦山县| 潼南县| 儋州市| 渝北区| 辰溪县| 洞头县| 晋城| 佛坪县| 綦江县| 洛阳市| 白山市| 阜康市| 茌平县| 屏边| 无棣县| 同德县| 定日县| 安溪县| 都安| 梁山县| 德格县| 浙江省| 台江县| 如东县| 广昌县| 新源县| 台中市| 山西省| 玛纳斯县|