Struts2学习9--文件下载

一、解决

1)文件中文名称容易出错的问题

2)对下载进行权限管理

二、基本原理:

直接链接到一个action里去,这个action执行后输出的结果类型是type="stream"类型。

三、实现方法

1)JSP

<a href="<%=basePath%>fileOp/download?fileName=1.png">图片文件下载</a> 

2)action配置

  <package name="/fileOp" extends="struts-default">
  <action name="download"  class="com.meetcomet.util.FileDownLoadAction">
       <param name="path">/download</param>
       <result name="success" type="stream">
          <param name="contentType">
            image/bmp,image/x-png,image/gif,image/pjpeg
          </param>
          <!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。 -->
          <param name="contentDisposition">
            attachment;filename=${fileName}
          </param>
          <param name="inputName">targetFileName</param>
          <!-- 缓冲区大小 -->
          <param name="bufferSize">2048</param>
       </result>
       <result name="error">/fail.jsp</result>
     </action>
</package>

3)Action

 1 public class FileDownLoadAction extends ActionSupport {
 2 
 3     private String fileName;  
 4     private String path;  
 5     private InputStream targetFileName;  
 6     
 7     public String getFileName() {
 8         return fileName;
 9     }
10 
11     public void setFileName(String fileName) {
12         this.fileName = fileName;
13     }
14 
15     public String getPath() {
16         return ServletActionContext.getServletContext().getRealPath(path);
17     }
18 
19     public void setPath(String path) {
20         this.path = path;
21     }
22 
23 
24 
25     public String execute() {
26         // TODO Auto-generated method stub
27         String filePath=getPath()+ "\" + getFileName();  
28         try {  
29             targetFileName=new FileInputStream(filePath);  
30             return SUCCESS;  
31         } catch (FileNotFoundException e) {  
32             e.printStackTrace();  
33             return ERROR;  
34         }  
35     
36     }
37 
38     public InputStream getTargetFileName() {
39         return targetFileName;
40     }
41 
42     public void setTargetFileName(InputStream targetFileName) {
43         this.targetFileName = targetFileName;
44     }
45 
46 
47 
48 }
View Code

注意:其他例子直接把文件名写在了配置里面,如下:这种太不方便了吧。

<package name="/fileOp" extends="struts-default">
 <action name="download"  class="com.meetcomet.util.FileDownLoadAction">
   <param name="path">/download</param>
      <param name="fileName">1.png</param>  <!-- -不一样的地方 -->
   <result name="success" type="stream">
    <param name="contentType">
     image/bmp,image/x-png,image/gif,image/pjpeg
    </param>
    <!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。 -->
    <param name="contentDisposition">
     attachment;filename=${fileName}
    </param>
    <param name="inputName">targetFileName</param>
    <!-- 缓冲区大小 -->
    <param name="bufferSize">2048</param>
   </result>
   <result name="error">/fail.jsp</result>
  </action>
</package>

 

原文地址:https://www.cnblogs.com/meetcomet/p/3414030.html