Struts2文件上传下载实例

原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/25167207


一、文件上传


       Struts2并没有提供文件上传的组件,所以想要实现上传的功能就必须通过第三方组件来实现,在Struts2引用的jar中包含了文件上传的组件,它是通过commons-fileupload.jar和commons-io.jar来实现的。这其中的处理细节不需要太懂,在使用中慢慢思考就可以做到灵活运用。


  1、首先编写Action类

       该类名称为downloadAction.java,必须在该类中引入java.io,文件上传的核心实现使用的还是java的数据流io操作。

  1. package com.action;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import org.apache.struts2.ServletActionContext;  
  7.   
  8. import com.opensymphony.xwork2.ActionSupport;  
  9.   
  10. public class uploadAction extends ActionSupport {  
  11.       
  12.     private File file;  
  13.       
  14.     public File getFile() {  
  15.         return file;  
  16.     }  
  17.   
  18.     public void setFile(File file) {  
  19.         this.file = file;  
  20.     }  
  21.   
  22.     public String getFileFileName() {  
  23.         return fileFileName;  
  24.     }  
  25.   
  26.     public void setFileFileName(String fileFileName) {  
  27.         this.fileFileName = fileFileName;  
  28.     }  
  29.   
  30.     public String getFileContentType() {  
  31.         return fileContentType;  
  32.     }  
  33.   
  34.     public void setFileContentType(String fileContentType) {  
  35.         this.fileContentType = fileContentType;  
  36.     }  
  37.   
  38.     //文件名称  
  39.     private String fileFileName;  
  40.       
  41.     //文件类型  
  42.     private String fileContentType;  
  43.     //注意:文件名称和文件类型的名称前缀必须相同,  
  44.       
  45.     @Override  
  46.     public String execute() throws Exception{     
  47.           
  48.         //获取需要上传文件的文件路径  
  49.         File uploadFile=new File(ServletActionContext.getServletContext().getRealPath("uploadFile"));  
  50.         //判断文件是否上传,如果上传的话将会创建该目录  
  51.         if(!uploadFile.exists()){  
  52.             uploadFile.mkdir(); //创建该目录  
  53.         }  
  54.           
  55.         //第一种文件上传的方法  
  56.         //声明文件输入流,为输入流指定文件路径  
  57.         FileInputStream input=new FileInputStream(file);  
  58.         //获取输出流,获取文件的文件地址及名称  
  59.         FileOutputStream out=new FileOutputStream(uploadFile + "\\" +fileFileName);  
  60.           
  61.         try{  
  62.             byte[] b=new byte[1024];//每次写入的大小  
  63.             int i=0;  
  64.             while((i=input.read(b))>0){  
  65.                 out.write(b,0,i);  
  66.             }  
  67.         }catch(Exception e){  
  68.             e.printStackTrace();  
  69.         }finally{  
  70.             input.close();  
  71.             out.close();  
  72.         }  
  73.           
  74.           
  75.           
  76.         //第二种文件上传的方法  
  77.         //FileUtils.copyFile(upload,new File(uploadFile+"\\"+uploadFileName));  
  78.         //FileUtils.copyFile(upload,new File(uploadFile,uploadFileName));  
  79.           
  80.         //第三种方法  
  81. //      BufferedReader bReader=new BufferedReader(new InputStreamReader(new FileInputStream(upload)));  
  82. //      BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile+"\\"+uploadFileName)));  
  83.           
  84. //      try{  
  85. //          char[] str=new char[1024];  
  86. //          int i=0;  
  87. //          while((i=bReader.read(str))>0){  
  88. //              bWriter.write(str,0,i);   
  89. //          }  
  90. //      }catch(Exception e){  
  91. //          e.printStackTrace();  
  92. //      }finally{  
  93. //          bReader.close();  
  94. //          bWriter.close();  
  95. //          uploadFile.delete();  
  96. //      }  
  97.           
  98.         return "success";  
  99.     }  
  100.   
  101. }  

        Action类中需要注意的是 文件名和文件类型的命名都是有要求的,文件名和文件类型的前缀必须是文件变量,并且要和jsp页面中添加的文件名称一致,如上例中的jsp标签为:<input type='File' name='file'>,在Action类中的文件名称和文件类型必须相应为fileXXX和fileXXX。另外也可以在该Action类中配置其它上传属性,如:可以通过maximumSize指定上传文件的大小,allowedTypes执行上传文件的类型。

       上面的Action类指定了三种上传方法,它们操作的核心还是java.io,通过数据流的读入和写出来实现文件的上传。其中第一种和第三种采用的是java.io流操作,而第二种采用的是common.io流操作。


   2、struts2.xml相应的action配置

       action类编写完成后,接下来要把它配置到相应的action标签中,这样在执行action时会根据注册类执行内部的方法。具体配置方法如下实例。

  1. <package name="upload" namespace="/file" extends="struts-default">  
  2.     <action name="upload" class="uploadAction">  
  3.         <result name="success">/success.jsp</result>  
  4.         <result name="error">/error.jsp</result>  
  5.         <result name="input">/index.jsp</result>  
  6.         <param name="savePath">/upload</param>  
  7.     </action>  
  8. </package>  

   3、最后配置相应的jsp页面

        在配置时需要注意的是文件的编码格式,需要改成multipart/form-data类型,是指把文件及文件的内容都提交,另外enctype还有两个属性值分别是text/plain,指定了表单是以文本的方式进行提交;application/x-www-form-urlencoded这是默认的编码方式,提交时,只提交表单域的value属性值。

  1. <body>  
  2.     <form action="file/upload" method="post" enctype="multipart/form-data">  
  3.         <input type="file" name="upload">  
  4.         <input type="submit" name="btnUpload" value="上传">  
  5.     </form>  
  6. </body>  

     最后提交,查看提交结果,提交后的文件默认存放在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\项目名称\uploadFile下,所以在编写action类时需要获取文件上传的路径使用的是getRealPath("uploadFile")。


二、文件下载


      相较上传,文件的下载编写起来相交就简单多了,首先也需要添加下载的action类,然后配置struts.xml中的action,最后在jsp中添加链接标签。


  1、添加下载action类

       添加的action类指定要注意获取文件的输出路径,通过获取输出流来获取文件的路径。

  1. package com.action;  
  2.   
  3. import java.io.InputStream;  
  4.   
  5. import org.apache.struts2.ServletActionContext;  
  6.   
  7. import com.opensymphony.xwork2.ActionSupport;  
  8.   
  9. public class downloadAction extends ActionSupport {  
  10.       
  11.     private InputStream fileInput;  
  12.     private String fileName;  
  13.   
  14.     public String getFileName() {  
  15.         return fileName;  
  16.     }  
  17.   
  18.     public void setFileName(String fileName) {  
  19.         this.fileName = fileName;  
  20.     }  
  21.   
  22.     public InputStream getFileInput() {  
  23.         return ServletActionContext.getServletContext().getResourceAsStream("upload\\"+fileName);  
  24.     }  
  25.   
  26.     public void setFileInput(InputStream fileInput) {  
  27.         this.fileInput = fileInput;  
  28.     }  
  29.       
  30.     public String execute() throws Exception{  
  31.         fileInput=ServletActionContext.getServletContext().getResourceAsStream("upload\\"+fileName);  
  32.         return "success";  
  33.     }  
  34. }  

   2、配置struts.xml标签

        在配置时结果类型要指定type类型,将它赋值为stream,并添加属性下面的属性,该属性同样可以配置到拦截器中,在拦截器中指定配置的文件。

  1. <action name="download" class="com.action.downloadAction">  
  2.         <result name="success" type="stream">  
  3.         <param name="inputName">fileInput</param>  
  4.         <param name="contentDispostion">attachment;filename="$(fileName)"</param>  
  5.     </result>  
  6. </action>  


    3、jsp页面代码

       jsp代码就很简单了,不多说看代码。

  1. <body>  
  2.     <a href="file/download">123.txt</a>  
  3. </body> 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值