Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1966629
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类: Java

2009-07-23 14:04:14

一、上传单个文件

上传文件是很多Web程序都具有的功能。在Struts1.x中已经提供了用于上传文件的组件。而在Struts2中提供了一个更为容易操作的上传文件组件。所不同的是,Struts1.x的上传组件需要一个ActionForm来传递文件,而Struts2的上传组件是一个拦截器(这个拦截器不用配置,是自动装载的)。在本文中先介绍一下如何用struts2上传单个文件,最后介绍一下用struts2上传任意多个文件。

要用Struts2实现上传单个文件的功能非常容易实现,只要使用普通的Action即可。但为了获得一些上传文件的信息,如上传文件名、上传文件类型以及上传文件的Stream对象,就需要按着一定规则来为Action类增加一些getter和setter方法。

在Struts2中,用于获得和设置java.io.File对象(Struts2将文件上传到临时路径,并使用java.io.File打开这个临时文件)的方法是getUpload和setUpload。获得和设置文件名的方法是getUploadFileName和setUploadFileName,获得和设置上传文件内容类型的方法是getUploadContentType和setUploadContentType。下面是用于上传的动作类的完整代码:

  1. package action;  
  2.  
  3. import java.io.*;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5.  
  6. public class UploadAction extends ActionSupport   
  7. {  
  8.     private File upload;  
  9.     private String fileName;  
  10.     private String uploadContentType;  
  11.       
  12.     public String getUploadFileName()  
  13.     {  
  14.         return fileName;  
  15.     }  
  16.  
  17. //在页面设置了上传input为upload,则会默认的将上传文件的文件名赋值到uploadFileName
  18.     public void setUploadFileName(String fileName)  
  19.     {  
  20.         this.fileName = fileName;  
  21.     }  
  22.  
  23.     public File getUpload()  
  24.     {  
  25.         return upload;  
  26.     }  
  27.  
  28.     public void setUpload(File upload)  
  29.     {  
  30.         this.upload = upload;  
  31.     }  
  32.     public void setUploadContentType(String contentType)  
  33.     {  
  34.         this.uploadContentType=contentType;  
  35.       
  36.     }  
  37.       
  38.     public String getUploadContentType()  
  39.     {  
  40.         return this.uploadContentType;  
  41.     }  
  42.     public String execute() throws Exception  
  43.     {     
  44.         java.io.InputStream is = new java.io.FileInputStream(upload);  
  45.         java.io.OutputStream os = new java.io.FileOutputStream("d:\\upload\\" + fileName);  
  46.         byte buffer[] = new byte[8192];  
  47.         int count = 0;  
  48.         while((count = is.read(buffer)) > 0)  
  49.         {  
  50.             os.write(buffer, 0, count);  
  51.         }  
  52.         os.close();  
  53.         is.close();  
  54.         return SUCCESS;  
  55.     }  
  56. }  

在execute方法中的实现代码就很简单了,只是从临时文件复制到指定的路径(在这里是d:\upload)中。上传文件的临时目录的默认值是javax.servlet.context.tempdir的值,但可以通过struts.properties(和struts.xml在同一个目录下)的struts.multipart.saveDir属性设置。Struts2上传文件的默认大小限制是2M(2097152字节),也可以通过struts.properties文件中的struts.multipart.maxSize修改,如struts.multipart.maxSize=2048 表示一次上传文件的总大小不能超过2K字节。

下面的代码是上传文件的JSP页面代码:

  1.  
  2. < %@ page language="java" import="java.util.*" pageEncoding="GBK"%> 
  3. < %@ taglib prefix="s" uri="/struts-tags"%> 
  4.  
  5. < html> 
  6.     < head> 
  7.         < title>上传单个文件< /title> 
  8.     < /head> 
  9.  
  10.     < body> 
  11.         < s:form action="upload" namespace="/test" 
  12.             enctype="multipart/form-data"> 
  13.             < s:file name="upload" label="输入要上传的文件名" /> 
  14.             < s:submit value="上传" /> 
  15.         < /s:form> 
  16.  
  17.     < /body> 
  18. < /html> 

注意不能少了:enctype="multipart/form-data",否则上传不能赋值到JavaBean的upload

也可以在success.jsp页中通过< s:property>获得文件的属性(文件名和文件内容类型),代码如下:

< s:property value="uploadFileName"/>

二、上传任意多个文件

在Struts2中,上传任意多个文件也非常容易实现。首先,要想上传任意多个文件,需要在客户端使用DOM技术生成任意多个< input type=”file” />标签。name属性值都相同。代码如下:

  1. < html> 
  2.     < head> 
  3.         < script language="javascript"> 
  4.  
  5. function addComponent()  
  6. {  
  7.         var uploadHTML = document.createElement( "< input type='file'  name='upload'/>");  
  8.         document.getElementById("files").appendChild(uploadHTML);  
  9.         uploadHTML = document.createElement( "< p/>");  
  10.         document.getElementById("files").appendChild(uploadHTML);  
  11. }  
  12. < /script> 
  13.     < /head> 
  14.     < body> 
  15.         < input type="button" onclick="addComponent();" value="添加文件" /> 
  16.         < br /> 
  17.         < form onsubmit="return true;" action="/struts2/test/upload.action" 
  18.             method="post" enctype="multipart/form-data"> 
  19.             < span id="files"> < input type='file' name='upload' /> 
  20.                 < p /> 
  21.             < /span> 
  22.             < input type="submit" value="上传" /> 
  23.         < /form> 
  24.     < /body> 
  25.  
  26. < /html> 

上面的javascript代码可以生成任意多个< input type=’file’>标签,name的值都为file(要注意的是,上面的javascript代码只适合于IE浏览器,firefox等其他浏览器需要使用他的代码)。至于Action类,和上传单个文件的Action类基本一至,只需要将三个属性的类型改为List即可。代码如下:

  1. package action;  
  2.  
  3. import java.io.*;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5.  
  6. public class UploadMoreAction extends ActionSupport  
  7. {  
  8.     private java.util.List< File> uploads;  
  9.     private java.util.List< String> fileNames;  
  10.     private java.util.List< String> uploadContentTypes;  
  11.  
  12.     public java.util.List< String> getUploadFileName()  
  13.     {  
  14.         return fileNames;  
  15.     }  
  16.     public void setUploadFileName(java.util.List< String> fileNames)  
  17.     {  
  18.         this.fileNames = fileNames;  
  19.     }  
  20.     public java.util.List< File> getUpload()  
  21.     {  
  22.         return uploads;  
  23.     }  
  24.  
  25.     public void setUpload(java.util.List< File> uploads)  
  26.     {  
  27.         this.uploads = uploads;  
  28.     }  
  29.  
  30.     public void setUploadContentType(java.util.List< String> contentTypes)  
  31.     {  
  32.         this.uploadContentTypes = contentTypes;  
  33.  
  34.     }  
  35.  
  36.     public java.util.List< String> getUploadContentType()  
  37.     {  
  38.         return this.uploadContentTypes;  
  39.     }  
  40.  
  41.     public String execute() throws Exception  
  42.     {  
  43.         if (uploads != null)  
  44.         {  
  45.             int i = 0;  
  46.             for (; i <  uploads.size(); i++)  
  47.             {  
  48.                 java.io.InputStream is = new java.io.FileInputStream(uploads.get(i));  
  49.                 java.io.OutputStream os = new java.io.FileOutputStream(  
  50.                         "d:\\upload\\" + fileNames.get(i));  
  51.                 byte buffer[] = new byte[8192];  
  52.                 int count = 0;  
  53.                 while ((count = is.read(buffer)) > 0)  
  54.                 {  
  55.                     os.write(buffer, 0, count);  
  56.                 }  
  57.                 os.close();  
  58.                 is.close();  
  59.             }  
  60.         }  
  61.         return SUCCESS;  
  62.     }  
  63. }  

在execute方法中,只是对List对象进行枚举,在循环中的代码和上传单个文件时的代码基本相同。如果读者使用过struts1.x的上传组件,是不是感觉Struts2的上传功能更容易实现呢?在Struts1.x中上传多个文件时,可是需要建立带索引的属性的。而在Struts2中,就是这么简单就搞定了。图1是上传任意多个文件的界面。

上传任意多个文件的界面

阅读(1208) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~