博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现文件上传的Action
阅读量:6835 次
发布时间:2019-06-26

本文共 3471 字,大约阅读时间需要 11 分钟。

 

假设有如图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框架的注入,允许在配置文件中为该属性动态指定值

 

 

本文转自

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

你可能感兴趣的文章
Nginx 作为反向代理优化要点proxy_buffering
查看>>
折腾大半年,西部数据终于收购了东芝半导体业务
查看>>
http长连接和短连接
查看>>
送上最新鲜的互联网行业新闻-【2015-05-12】
查看>>
印花税下调,今天股市上涨概率很大
查看>>
如何描述一张数据表的基本信息?
查看>>
Linux系统下UDP发送和接收广播消息小例子
查看>>
Asp.net跨站脚本攻击XSS实例分享
查看>>
Linux系统下的单调时间函数
查看>>
美国人开发了一个有趣的网站,可以算出你被机器人抢饭碗的概率
查看>>
H.264中NAL、Slice与frame意思及相互关系
查看>>
《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.25. Gzip-1.6...
查看>>
Spark-SparkSQL深入学习系列六(转自OopsOutOfMemory)
查看>>
在HTML下,如何为多个选择框提取数据并序列化
查看>>
还以为敏捷开发是个概念?有人已经将它变为现实了!
查看>>
无服务计算是未来
查看>>
热点推荐:Java类加载器深入理解
查看>>
如何实现一个稍微复杂的simplelist
查看>>
安全课堂:云安全七项最佳实践
查看>>
数据分析,或许不是为了分析,而是为了规范
查看>>