昨天,根据需求文档的要求,自己要做一个关于文件下载的功能,从学校毕业已经很久了,自己好长时间都没有做过这个了,于是自己上网百度,最终开发出来的代码如下:

哦!对了,我先说一下我的思路,首先需要获取服务器上文件存储的路径,然后将文件下载到本地。自己是先查询表中的文件的路径。

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

java代码实现文件的下载功能_页面失效

 

下面是自己的代码,自己写在了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系统就不会存在这种问题,当然有问题总会是有解决的办法的。加上这两行代码之后,就不会报这种错误了。