实现文件上传的Action

简介:

 

假设有如图4.22所示的文件上传页面,其中包含两个表单域:文件标题和文件域——当然,为了能完成文件上传,我们应该将这两个表单域所在表单的enctype属性设置为“multipart/form-data”。该页面的代码如下。

程序清单:codes\04\4.3\simpleUpload\WEB-INF\content\upload.jsp

 
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <%@taglib prefix="s" uri="/struts-tags"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head>  
  7.     <title>简单的文件上传</title>  
  8. </head>  
  9. <body>  
  10. <s:form action="uploadPro" 
  11.     enctype="multipart/form-data">  
  12.     <s:textfield name="title" label="文件标题"/><br />  
  13.     <s:file name="upload" label="选择文件"/><br />  
  14.     <s:submit value="上传"/>  
  15. </s:form>  
  16. </body>  
  17. </html>  

 

上面的页面使用了Struts 2的标签库来生成上传文件的表单,其中<s:file…/>用于生成一个文件上传域。当该页面提交请求时,请求发送到uploadPro.action,这是Struts 2的一个Action

Struts 2Action无须负责处理HttpServletRequest请求,正如前面介绍的,Struts 2Action已经与Servlet API彻底分离了,Struts 2框架负责解析HttpServletRequest请求中的参数,包括文件域,Struts 2使用File类型来封装文件域。下面是处理上传请求的Action类代码。

程序清单:codes\04\4.3\simpleUpload\WEB-INF\src\org\crazyit\app\action\UploadAction.java

 
  1. public class UploadAction extends ActionSupport  
  2. {  
  3.     //封装文件标题请求参数的属性  

 
  1.  
  2.     private String title;  
  3.     //封装上传文件域的属性  
  4.     private File upload;  
  5.     //封装上传文件类型的属性  
  6.     private String uploadContentType;  
  7.     //封装上传文件名的属性  
  8.     private String uploadFileName;  
  9.     //直接在struts.xml文件中配置的属性  
  10.     private String savePath;  
  11.     //接受struts.xml文件配置值的方法  
  12.     public void setSavePath(String value)  
  13.     {  
  14.         this.savePath = value;  
  15.     }  
  16.     //返回上传文件的保存位置  
  17.     private String getSavePath() throws Exception   
  18.     {  
  19.         return ServletActionContext.getServletContext()  
  20.             .getRealPath("/WEB-INF/" + savePath);  
  21.     }  
  22.     //文件标题的setter和getter方法  
  23.     public void setTitle(String title)   
  24.     {  
  25.         this.title = title;   
  26.     }  
  27.     public String getTitle()  
  28.     {  
  29.         return (this.title);   
  30.     }  
  31.     //上传文件对应文件内容的setter和getter方法  
  32.     public void setUpload(File upload)   
  33.     {  
  34.         this.upload = upload;   
  35.     }  
  36.     public File getUpload()   
  37.     {  
  38.         return (this.upload);   
  39.     }  
  40.     //上传文件的文件类型的setter和getter方法  
  41.     public void setUploadContentType(String uploadContentType)   
  42.     {  
  43.         this.uploadContentType = uploadContentType;   
  44.     }  
  45.     public String getUploadContentType()  
  46.     {  
  47.         return (this.uploadContentType);   
  48.     }  
  49.     //上传文件的文件名的setter和getter方法  
  50.     public void setUploadFileName(String uploadFileName)   
  51.     {  
  52.         this.uploadFileName = uploadFileName;   
  53.     }  
  54.     public String getUploadFileName()   
  55.     {  
  56.         return (this.uploadFileName);   
  57.     }     
  58.     @Override 
  59.     public String execute() throws Exception  
  60.     {  
  61.         //以服务器的文件保存地址和原文件名建立上传文件输出流  
  62.         FileOutputStream fos = new FileOutputStream(getSavePath()  
  63.             + "\\" + getUploadFileName());  
  64.         FileInputStream fis = new FileInputStream(getUpload());  
  65.         byte[] buffer = new byte[1024];  
  66.         int len = 0;  
  67.         while ((len = fis.read(buffer)) > 0)  
  68.         {  
  69.             fos.write(buffer , 0 , len);  
  70.         }  
  71.         return SUCCESS;  
  72.     }  
  73. }  

 

上面的Action与普通的Action并没有太大的不同,一样提供了uploadtitle两个属性,这两个属性分别对应前面的两个表单域的name属性,用于封装两个表单域的请求参数。

值得注意的是,上面的Action还包含了两个属性:uploadFileNameuploadContentType(如上粗体字代码所示),这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。这两个属性,体现了Struts 2设计的灵巧、简化之处,Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts 2直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileNameuploadContentType属性中。可以认为:如果表单中包含一个name属性为xxx的文件域,则对应Action需要使用三个属性来封装该文件域的信息。

Ø  类型为Filexxx属性封装了该文件域对应的文件内容。

Ø  类型为StringxxxFileName属性封装了该文件域对应的文件的文件名。

Ø  类型为StringxxxContentType属性封装了该文件域对应的文件的文件类型。

通过上面的3个属性,可以更简单地实现文件上传,所以在execute方法中,可以直接通过调用getXxx()方法来获取上传文件的文件名、文件类型和文件内容。

除此之外,上面的Action中还包含了一个savePath属性,该属性的值通过配置文件来设置,从而允许动态设置该属性的值。

 

 

 

Struts 2Action中的属性,功能非常丰富,除了可以用于封装HTTP请求参数外,也可以封装Action的处理结果。不仅如此,Action的属性还可通过在Struts 2配置文件中进行配置,接收Struts 2框架的注入,允许在配置文件中为该属性动态指定值


 

 

本文转自fkJava李刚

 51CTO博客,原文链接:http://blog.51cto.com/javaligang/887975 ,如需转载请自行联系原作者

相关文章
|
6月前
LayUI upload上传组件上传文件的两种方式
LayUI upload上传组件上传文件的两种方式
416 0
|
前端开发 JavaScript 应用服务中间件
multer实现文件上传功能全解(form上传、fetch请求上传、多文件上传)
multer实现文件上传功能全解(form上传、fetch请求上传、多文件上传)
multer实现文件上传功能全解(form上传、fetch请求上传、多文件上传)
|
3天前
|
存储
ant-design Upload上传组件使用 action上传
ant-design Upload上传组件使用 action上传
139 0
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
4219 0
|
前端开发 JavaScript
el-upload上传文件和表单一起提交+后端接收代码
el-upload上传文件和表单一起提交+后端接收代码
434 3
el-upload上传文件和表单一起提交+后端接收代码
|
XML 安全 Java
action 的三种实现方式 | 学习笔记
快速学习 action 的三种实现方式,介绍了 action 的三种实现方式系统机制, 以及在实际应用过程中如何使用。
190 0