昨天,根據需求文檔的要求,自己要做一個關於文件下載的功能,從學校畢業已經很久了,自己好長時間都沒有做過這個了,於是自己上網百度,最終開發出來的代碼如下:
哦!對了,我先說一下我的思路,首先需要獲取服務器上文件存儲的路徑,然后將文件下載到本地。自己是先查詢表中的文件的路徑。
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系統就不會存在這種問題,當然有問題總會是有解決的辦法的。加上這兩行代碼之后,就不會報這種錯誤了。