在Struts 2中实现文件上传

14 篇文章 0 订阅
在Struts 2中实现文件上传  

     Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
                                                                                    
具体实现 

    前段时间Apache发布了Struts 2.0.6 GA,所以本文的实现是以该版本的Struts作为框架的。以下是例子所依赖类包的列表:依赖类包的列表 
清单1 依赖类包的列表

首先,创建文件上传页面FileUpload.jsp,内容如下:
<% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %> 
<% @ taglib prefix = " s " uri = " /struts-tags " %> 

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > 
< html xmlns ="http://www.w3.org/1999/xhtml" > 
< head > 
    
< title > Struts 2 File Upload </ title > 
</ head > 
< body > 
    
< s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" > 
        
< s:file name ="myFile" label ="Image File" /> 
        
< s:textfield name ="caption" label ="Caption" />        
        
< s:submit /> 
    
</ s:form > 
</ body > 
</ html >

清单2 FileUpload.jsp

在FileUpload.jsp中,先将表单的提交方式设为POST,然后将enctype设为multipart/form-data,这并没有什么特别之处。接下来,<s:file/>标志将文件上传控件绑定到Action的myFile属性。

其次是FileUploadAction.java代码:

package  tutorial;

import  java.io.BufferedInputStream;
import  java.io.BufferedOutputStream;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileOutputStream;
import  java.io.InputStream;
import  java.io.OutputStream;
import  java.util.Date;

import  org.apache.struts2.ServletActionContext;

import  com.opensymphony.xwork2.ActionSupport;

  public  class  FileUploadAction  extends  ActionSupport  private  static  final  long  serialVersionUID  =  572146812454l  ;
   
  private  static  final  int  BUFFER_SIZE  =  16  *  1024  ;
   
   
  private  File myFile;
   
  private  String contentType;
   
  private  String fileName;
   
  private  String imageFileName;
   
  private  String caption;
   
    
  public  void  setMyFileContentType(String contentType)  this  .contentType  =  contentType;
   }
 
   
    
  public  void  setMyFileFileName(String fileName)  this  .fileName  =  fileName;
   }
 
       
    
  public  void  setMyFile(File myFile)  this  .myFile  =  myFile;
   }
 
   
    
  public  String getImageFileName()  return  imageFileName;
   }
 
   
    
  public  String getCaption()  return  caption;
   }
 

    
  public  void  setCaption(String caption)  this  .caption  =  caption;
   }
 
   
    
  private  static  void  copy(File src, File dst)  try  =  null  ;
           OutputStream out 
=  null  ;
            
  try  =  new  BufferedInputStream(  new  FileInputStream(src), BUFFER_SIZE);
               out 
=  new  BufferedOutputStream(  new  FileOutputStream(dst), BUFFER_SIZE);
               
  byte  [] buffer  =  new  byte  [BUFFER_SIZE];
                
  while  (in.read(buffer)  >  0 
            }
  finally  if  (  null  !=  in) 
                
  if  (  null  !=  out) 
           }
 
        }
  catch  (Exception e) 
   }
 
   
    
  private  static  String getExtention(String fileName)  int  pos  =  fileName.lastIndexOf(  "  .  "  );
       
  return  fileName.substring(pos);
   }
 

   @Override
    
  public  String execute()      =  new  Date().getTime()  +  getExtention(fileName);
       File imageFile 
=  new  File(ServletActionContext.getServletContext().getRealPath(  "  /UploadImages "  +  "  /  "  +  imageFileName);
       copy(myFile, imageFile);
       
  return  SUCCESS;
   }
 
   
}
清单3 tutorial/FileUploadAction.java

 

在FileUploadAction中我分别写了setMyFileContentType、setMyFileFileName、setMyFile和setCaption四个Setter方法,后两者很容易明白,分别对应FileUpload.jsp中的<s:file/>和<s:textfield/>标志。但是前两者并没有显式地与任何的页面标志绑定,那么它们的值又是从何而来的呢?其实,<s:file/>标志不仅仅是绑定到myFile,还有myFileContentType(上传文件的MIME类型)和myFileFileName(上传文件的文件名,该文件名不包括文件的路径)。因此,<s:file name="xxx" />对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。

FileUploadAction作用是将浏览器上传的文件拷贝到WEB应用程序的UploadImages文件夹下,新文件的名称是由系统时间与上传文件的后缀组成,该名称将被赋给imageFileName属性,以便上传成功的跳转页面使用。

下面我们就来看看上传成功的页面:

<%  @ page language  =  "  java  "  contentType  =  "  text/html; charset=utf-8  "  pageEncoding  =  "  utf-8  "  %> 
<%  @ taglib prefix  =  "  s  "  uri  =  "  /struts-tags  "  %> 

<!  DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"  > 
<  html  xmlns  ="http://www.w3.org/1999/xhtml"  > 
<  head  > 
    
<  title  >  Struts 2 File Upload  </  title  > 
</  head  > 
<  body  > 
    
<  div  style  ="padding: 3px; border: solid 1px #cccccc; text-align: center"  > 
        
<  img  src  ='UploadImages/<s:property  value  ="imageFileName"  />  ' />
        
<  br  /> 
        
<  s:property  value  ="caption"  /> 
    
</  div  > 
</  body  > 
</  html  >

 

错误处理

上述例子实现的图片上传的功能,所以应该阻止用户上传非图片类型的文件。在Struts 2中如何实现这点呢?其实这也很简单,对上述例子作如下修改即可。

首先修改FileUpload.jsp,在<body>与<s:form>之间加入“<s:fielderror />”,用于在页面上输出错误信息。

然后修改struts.xml文件,将Action fileUpload的定义改为如下所示:

         <  action  name  ="fileUpload"  class  ="tutorial.FileUploadAction"  > 
            
<  interceptor-ref  name  ="fileUpload"  > 
                
<  param  name  ="allowedTypes"  > 
                    image/bmp,image/png,image/gif,image/jpeg
                
</  param  > 
            
</  interceptor-ref  > 
            
<  interceptor-ref  name  ="defaultStack"  />             
            
<  result  name  ="input"  >  /FileUpload.jsp  </  result  > 
            
<  result  name  ="success"  >  /ShowUpload.jsp  </  result  > 
        
</  action  > 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值