昨天,根据需求⽂档的要求,⾃⼰要做⼀个关于⽂件下载的功能,从学校毕业已经很久了,⾃⼰好长时间都没有做过这个了,于是⾃⼰上⽹百度,最终开发出来的代码如下:
哦!对了,我先说⼀下我的思路,⾸先需要获取服务器上⽂件存储的路径,然后将⽂件下载到本地。⾃⼰是先查询表中的⽂件的路径。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\//保单号 √
50 tTransferData.setNameAndValue(\"QuestionType\//问题件类型 √
51 tTransferData.setNameAndValue(\"QuestionAttribute\//问题件属性 √ 52 tTransferData.setNameAndValue(\"QuestionReasion\//问题件原因 √ 53 tTransferData.setNameAndValue(\"QuestionSendEmail\//下发邮箱 √ 54 tTransferData.setNameAndValue(\"QuestionDes\//问题件描述 √ 55
56 tTransferData.setNameAndValue(\"QuestionID\ 57 tTransferData.setNameAndValue(\"sendnode\ 58 tTransferData.setNameAndValue(\"sender\
59 tTransferData.setNameAndValue(\"senddate\ 60 tTransferData.setNameAndValue(\"replier\
61 tTransferData.setNameAndValue(\"replycontent\ 62 tTransferData.setNameAndValue(\"replydate\ 63 tTransferData.setNameAndValue(\"state\
64 tTransferData.setNameAndValue(\"FilePath\//问题件附件下载路径 65
66 tTransferData.setNameAndValue(\"Operator\
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\ 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
142 150
注意:如果不加下⾯这两⾏代码的话
out.clear(); //清空缓存的内容
out=pageContext.pushBody(); //更新PageContext的out属性的内容
会报getOutputStream() has already been called for this response异常,挺烦⼈的,但是奇怪的是:⽂件居然能下载,但是最后就是会在控制台报这种错误,⾃⼰百度说是tomcat版本的问题,⽤linux系统就不会存在这种问题,当然有问题总会是有解决的办法的。加上这两⾏代码之后,就不会报这种错误了。
因篇幅问题不能全部显示,请点此查看更多更全内容