java代碼實現文件的下載功能


昨天,根據需求文檔的要求,自己要做一個關於文件下載的功能,從學校畢業已經很久了,自己好長時間都沒有做過這個了,於是自己上網百度,最終開發出來的代碼如下:

哦!對了,我先說一下我的思路,首先需要獲取服務器上文件存儲的路徑,然后將文件下載到本地。自己是先查詢表中的文件的路徑。

LPEdorAnnex表:(這是自己用到的表-其中用到的字段是AnnexParth)

 

下面是自己的代碼,自己寫在了jsp頁面中,因為如果寫在java類中,不知怎么搞的不太好實現,當然最主要的原因是因為自己實力不行,也因為當時自己趕時間,沒有那么多的事件仔細研究,如果以后有時間的話,自己一定要下來好好看看。

  1 <%--
  2   Created by IntelliJ IDEA.
  3   User: Blame
  4   Date: 2019/8/29
  5   Time: 10:49
  6   To change this template use File | Settings | File Templates.
  7   function:問題件下發
  8 --%>
  9 <%
 10 //程序名稱:
 11 // 程序功能:保全-問題件下發
 12 //創建日期:2019/09/09
 13 //創建人  :
 14 //更新記錄:  更新人    更新日期     更新原因/內容
 15 %>
 16 <%@ page import="com.sinosoft.utility.TransferData" %>
 17 <%@ page import="com.sinosoft.utility.VData" %>
 18 <%@ page import="com.sinosoft.service.BusinessDelegate" %>
 19 <%@ page import="com.sinosoft.lis.schema.LPPolicyHolderSchema" %>
 20 <%@ page import="com.sinosoft.lis.mgubq.PEdorTypeACUI" %>
 21 <%@ page import="com.sinosoft.utility.CErrors" %>
 22 <%@ page import="org.apache.log4j.Logger" %>
 23 <%@ page import="com.sinosoft.lis.mgubq.BQQuestionFileIssueUI" %>
 24 <%@ page import="java.io.*" %>
 25 <%@ page import="org.apache.jasper.JasperException" %>
 26 <%@page contentType="text/html;charset=utf-8" %>
 27 <%@include file="../common/jsp/UsrCheck.jsp" %>
 28 <%
 29     //輸出參數
 30     CErrors tError = null;
 31     String FlagStr = "Fail";
 32     String Content = "";
 33     GlobalInput tGI = new GlobalInput();
 34     tGI = (GlobalInput) session.getAttribute("GI");
 35     TransferData tTransferData=new TransferData();
 36 
 37     //頁面有效性判斷
 38     if (tGI == null) {
 39         FlagStr = "Fail";
 40         Content = "頁面失效,請重新登陸";
 41         Logger.getLogger("BQQuestionFileIssueSave").info("頁面失效,請重新登陸");
 42     } else {
 43         // 保存登陸管理員賬號
 44         String Operator = tGI.Operator;
 45         // fmtransact 操作符
 46         //獲取前台數據
 47         String tOperate = request.getParameter("fmtransact");
 48         //獲取頁面錄入的信息
 49         tTransferData.setNameAndValue("OtherNo", request.getParameter("OtherNo"));//保單號  √
 50         tTransferData.setNameAndValue("QuestionType", request.getParameter("QuestionType"));//問題件類型 √
 51         tTransferData.setNameAndValue("QuestionAttribute", request.getParameter("QuestionAttribute"));//問題件屬性 √
 52         tTransferData.setNameAndValue("QuestionReasion", request.getParameter("QuestionReason"));//問題件原因 √
 53         tTransferData.setNameAndValue("QuestionSendEmail", request.getParameter("sendemail"));//下發郵箱 √
 54         tTransferData.setNameAndValue("QuestionDes", request.getParameter("QuestionDes"));//問題件描述 √
 55 
 56         tTransferData.setNameAndValue("QuestionID", request.getParameter("QuestionID"));
 57         tTransferData.setNameAndValue("sendnode", request.getParameter("sendnode"));
 58         tTransferData.setNameAndValue("sender", request.getParameter("sender"));
 59         tTransferData.setNameAndValue("senddate", request.getParameter("senddate"));
 60         tTransferData.setNameAndValue("replier", request.getParameter("replier"));
 61         tTransferData.setNameAndValue("replycontent", request.getParameter("replycontent"));
 62         tTransferData.setNameAndValue("replydate", request.getParameter("replydate"));
 63         tTransferData.setNameAndValue("state", request.getParameter("state"));
 64         tTransferData.setNameAndValue("FilePath", request.getParameter("FilePath"));//問題件附件下載路徑
 65 
 66         tTransferData.setNameAndValue("Operator",tOperate);
 67         //問題件附件下載
 68         if("downloadQuestion".equals(tOperate)){
 69             try{
 70                 String filePath=request.getParameter("FilePath");
 71 
 72                 //將文件上傳至影響服務器,先獲取影響服務器配置路徑 by zhuting
 73                 String tpath="";
 74                 String tfilename="";
 75                 String sql="";
 76 
 77 
 78                 boolean tFileExists=true;
 79                 System.out.println("要下載的文件名:"+filePath);
 80                 File file = new File(filePath);
 81                 if(!file.exists()){
 82                     tFileExists=false;
 83                 }
 84                 if(tFileExists) {
 85                     InputStream fi = new FileInputStream(file);
 86                     //BufferedOutputStream處理txt格式時多出2行空行
 87                     response.reset();
 88                     response.setContentType("application/x-download");
 89                     response.addHeader("Content-Disposition", "attachment;filename=" + file.getName());
 90 
 91                     OutputStream outOS = response.getOutputStream();
 92                     BufferedOutputStream bos = new BufferedOutputStream(outOS);
 93 
 94                     int start;
 95                     byte[] bt = new byte[4096];
 96                     while ((start = fi.read(bt)) != -1) {
 97                         bos.write(bt, 0, start);
 98                     }
 99 
100                     bos.flush();
101                     fi.close();
102                     bos.close();
103                     outOS.close();
104                     out.clear();      //清空緩存的內容
105                     out=pageContext.pushBody();  //更新PageContext的out屬性的內容
106 
107 
108 
109                 }
110             }catch (Exception e){
111 
112             }
113 
114         }
115         //調用UI類
116         try {
117             //准備傳輸數據VData
118             VData tVData = new VData();
119             tVData.add(tTransferData);
120             tVData.add(tGI);
121             BusinessDelegate tBusinessDelegate = BusinessDelegate.getBusinessDelegate();
122             //這樣寫暫時調用不到UI類,所以先采用直接調用UI類的做法
123             //    if (!tBusinessDelegate.submitData(tVData, tOperate, "PEdorTypeACUI")) {
124             BQQuestionFileIssueUI tBQQuestionFileIssueUI = new BQQuestionFileIssueUI();
125             if (!tBQQuestionFileIssueUI.submitData(tVData, tOperate)) {
126                 Content = "數據保存失敗,原因是:" + tBQQuestionFileIssueUI.getErrors().getError(0).errorMessage;
127                 FlagStr = "Fail";
128             } else {
129                 FlagStr = "Success";
130                 Content = "處理成功!";
131             }
132         } catch (Exception ex) {
133             ex.printStackTrace();
134             Content = FlagStr + "處理異常,請聯系系統運維人員!";
135             FlagStr = "Fail";
136         }
137 
138     }
139 
140 %>
141 <html>
142 <script type="text/JavaScript">
143     try {
144         parent.fraInterface.afterSubmit('<%=FlagStr%>', '<%=Content%>');
145     }
146     catch (ex) {
147         <%--alert('<%=tContent%>');--%>
148     }
149 </script>
150 </html>

注意:如果不加下面這兩行代碼的話

    out.clear();      //清空緩存的內容
    out=pageContext.pushBody();  //更新PageContext的out屬性的內容

會報getOutputStream() has already been called for this response異常,挺煩人的,但是奇怪的是:文件居然能下載,但是最后就是會在控制台報這種錯誤,自己百度說是tomcat版本的問題,用linux系統就不會存在這種問題,當然有問題總會是有解決的辦法的。加上這兩行代碼之后,就不會報這種錯誤了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM