昨天,根据需求文档的要求,自己要做一个关于文件下载的功能,从学校毕业已经很久了,自己好长时间都没有做过这个了,于是自己上网百度,最终开发出来的代码如下:
哦!对了,我先说一下我的思路,首先需要获取服务器上文件存储的路径,然后将文件下载到本地。自己是先查询表中的文件的路径。
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系统就不会存在这种问题,当然有问题总会是有解决的办法的。加上这两行代码之后,就不会报这种错误了。