Struts1.x文件下载问题与解决方法
"关于Struts框架的文件下载方法" 在Java Web开发中,Struts是一个非常流行的MVC(Model-View-Controller)框架,用于构建基于J2EE的应用程序。本资源主要关注的是如何在Struts1.x版本中实现文件下载功能。 在尝试下载文件时,可能会遇到一些问题,例如错误信息的返回或者下载失败。这通常是因为配置不正确或者对Struts的文件下载机制理解不足导致的。首先,确保你的Struts1.x库是最新且完整的,可以从Apache官方仓库(http://struts.apache.org/)下载。 在Struts中,实现文件下载通常涉及到创建一个专门的Action类,比如`DownloadAction`。这个Action负责处理文件流的获取和发送到客户端。可以参考Apache Struts的官方文档(http://wiki.apache.org/struts/StrutsFileDownload)或者查看`DownloadAction`的源码(如http://www.docjar.org/html/api/org/apache/struts/actions/DownloadAction.java.html)来理解其内部工作原理。关键在于`getStreamInfo`方法,它提供文件的输入流,然后在`execute`方法中设置响应头信息,告知浏览器这是一个需要下载的文件。 以下是一个简单的`DownloadAction`执行方法的示例: ```java public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { FileDownLoadForm fdForm = (FileDownLoadForm) form; String path = fdForm.getFilePath(); response.setContentType("application/x-download"); String fileNameDownload = path; String fileNameDisplay = path.substring(path.lastIndexOf("/") + 1); try { fileNameDisplay = URLEncoder.encode(fileNameDisplay, "UTF-8"); response.addHeader("Content-Disposition", "attachment;filename=\"" + fileNameDisplay + "\""); // 读取文件并写入响应输出流 // ... return null; // 告诉Struts我们已经处理了响应,无需进一步操作 } catch (Exception e) { // 错误处理 } return mapping.findForward("error"); // 如果出现错误,转发到错误页面 } ``` 在上述代码中,`contentType`设置为"application/x-download"是为了让浏览器识别这是一个需要下载的文件。`Content-Disposition`头信息用来指定文件名,`attachment`参数表示附件,即将文件作为附件下载,而不是在浏览器中打开。 此外,为了触发下载,你需要在JSP页面中创建一个链接或表单,指向这个`DownloadAction`。例如: ```jsp <a href="<%= request.getContextPath() %>/download.do">点击下载</a> ``` 或者 ```jsp <form action="<%= request.getContextPath() %>/download.do" method="post"> <input type="hidden" name="filePath" value="/path/to/your/file"/> <input type="submit" value="下载"/> </form> ``` 在这个JSP中,`download.do`是映射到`DownloadAction`的URL路径,`filePath`参数用于传递文件的服务器路径。 最后,确保服务器具有足够的权限访问和读取待下载的文件,并且在处理过程中,对可能出现的异常进行适当的捕获和处理,以防止程序崩溃。 理解并正确实现Struts中的文件下载机制对于开发涉及文件交互的Web应用至关重要。通过创建专门的Action类,设置响应头信息,以及在JSP中创建合适的触发器,可以有效地实现在Struts1.x框架下的文件下载功能。
于是找啊找,单纯的文件下载功能还是挺容易的,既可以自己写,也可以用类似smartupload这类现成的包。 至于为什么不用直接的链接,是为了防止服务器文件结构泄漏,有心人其他文件也可以随意下载,那岂不是麻烦?
如果要自己写得话,action的写法大致有三 1, 用输入流,输出流 2, 用dispatcher 3, 用downloadAction
方法3是struts推荐的官方写http://wiki.apache.org/struts/StrutsFileDownload 写的时候,只要继承downloadAction类,然后重写getStreamInfo方法就可以了。但是看一下这个类的src http://www.docjar.org/html/api/org/apache/struts/actions/DownloadAction.java.html 就明白,这个类的getStreamInfo会把结果传给execute方法,而execute方法的最后却被注明
Java代码
// Tell Struts that we are done with the response.
return null;
意味着根本不可能做任何转向。至于试着再重写一下execute方法,好像没有人这么办,在google.com上以关键字downloadAction redirect 或者downloadAction foward,也没有任何可以有用的结果,所以首先放弃了这个方法。不过这个方法还是最简单最可靠的,仿照它给的例子,几行代码就完事,真好。
方法2 以前单独在jsp中,这种方法可能挺流行的,不过在action中一样行不通。 例如代码
Java代码
<pre class="java" name="code">public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
FileDownLoadForm fdform =(FileDownLoadForm)form;
String path = fdform.getFilePath();
response.setContentType("application/x-download");
String filenamedownload = path;
String filenamedisplay = path.substring(path.lastIndexOf("/")+1);
try {
filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);
RequestDispatcher dispatcher = request.getRequestDispatcher(filenamedownload);
if(dispatcher != null)
{
}
response.flushBuffer();
return null ;
// return mapping.findForward("success");
}catch(FileNotFoundException e){
e.printStackTrace();
return mapping.findForward("error");
}catch(Exception e){
e.printStackTrace();
return null;
}
}</pre>
解释1 为什么成功后return null 因为前面response 已经提交过,没办法再forward,否则报错
解释2 为什么FileNotFoundException转到error画面,因为对话框中,用户如果点取消按钮,tomcat会报ClientAbortException
假如连这个exception都抓掉,然后进行forward,一样会报response已经提交过的错误,根本无法转向。所以干脆就留
着它好了。
方法1 其实根方法3一样,输入流,输出流,有兴趣地可以用IOUtils.copy(in, response.getOutputStream());
没兴趣的可以参照以下代码,我也是参考论坛上一位兄弟的
Java代码
Java代码
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦