欢迎来到Java学习网!
设为首页 | 加入收藏
当前位置: 首页 > Java架构 > Struts >

Struts2使用开源项目Apache Jakarta Commons FileUpload和内建的FileUploadInterceptor拦截器实现文件上传.
实现原理 :
Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。

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

其中commons-io-1.1.jar和commons-fileupload-1.1.3.jar可以在http://jakarta.apache.org/上下载.

★ 文件上传页面 index.jsp:
 

  1. <%@ page language="java" pageEncoding="GB18030"%> 
  2. <%@taglib prefix="s" uri="/struts-tags" %> 
  3. <html> 
  4.   <head> 
  5.     <title>Upload Page</title> 
  6.   </head> 
  7.   <body> 
  8.   <s:form action="upload" method="post" enctype="multipart/form-data"> 
  9.       <s:file name="doc" label="File"/> 
  10.       <s:submit value="upload"/> 
  11.   </s:form> 
  12.   </body> 
  13. </html> 

先将表单的提交方式设为POST,然后将enctype设为multipart/form-data,这并没有什么特别之处.
★ 处理文件上传 FileUploadAction.java:

  1. package com;  
  2. import java.io.File;  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.Random;  
  6. import org.apache.commons.io.FileUtils;  
  7. import org.apache.struts2.ServletActionContext;  
  8. import com.opensymphony.xwork2.ActionSupport;  
  9.  
  10. public class FileUploadAction extends ActionSupport  
  11. {  
  12.     private static final long serialVersionUID = 4658947796066228597L;  
  13.     private File doc;  
  14.     private String fileName;  
  15.     private String contentType;  
  16.  
  17.     public void setDoc(File file)  
  18.     {  
  19.         this.doc = file;  
  20.     }  
  21.  
  22.     public void setDocFileName(String fileName)  
  23.     {  
  24.         this.fileName = fileName;  
  25.     }  
  26.  
  27.     public void setDocContentType(String contentType)  
  28.     {  
  29.         this.contentType = contentType;  
  30.     }  
  31.  
  32.     @Override  
  33.     public String execute() throws Exception  
  34.     {  
  35.         System.out.println("fileName:" + fileName);  
  36.         System.out.println("contextType" + contentType);  
  37.         // 得到当前web工程下的/files目录的在本机的绝对路径,如果没有这个文件夹则会创建  
  38.         String targetDirectory = ServletActionContext.getServletContext()  
  39.                 .getRealPath("/files");  
  40.         //重命名上传文件  
  41.         String targetFileName = generateFileName(fileName);  
  42.         //在指定目录创建文件  
  43.         File target = new File(targetDirectory, targetFileName);  
  44.         //把要上传的文件copy过去  
  45.         FileUtils.copyFile(doc, target);  
  46.         return SUCCESS;  
  47.     }  
  48.     //重命名上传文件(非必须)  
  49.     public String generateFileName(String fileName)  
  50.     {  
  51.         String formatDate = new SimpleDateFormat("yyMMddHHmmss")  
  52.                 .format(new Date());  
  53.         int random = new Random().nextInt(10000);  
  54.         int position = fileName.lastIndexOf(".");  
  55.         String extension = fileName.substring(position);  
  56.  
  57.         return formatDate + random + extension;  
  58.     }  
  59.  
  60.     public String getFileName()  
  61.     {  
  62.         return fileName;  
  63.     }  

在fileupload.jsp中,只有doc一个字段,而FileUploadAction.java中,却有三个字段,Struts2怎么通过页面的一个字段设置Action里的三个字段呢?没错,这就是FileUploadInterceptor的功劳了!你所要做的只是按照一定的样式命名这三个字段的set方法,而字段名可以任意命名。第一个File类型的字段的set方法还是以常规的方式命名,另两个String类型的字段的set方法必须分别以“File字段的set方法名+FileName”和“File字段的set方法名+ContentType”来命名。

★ 配置文件 struts.xml :
 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  5. <struts> 
  6.     <package name="com" extends="struts-default"> 
  7.         <action name="upload" class="com.FileUploadAction"> 
  8.             <result name="success">/success.jsp</result> 
  9.         </action> 
  10.     </package> 
  11. </struts> 

★ 配置文件 web.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>     
  2. <web-app version="2.4"       
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"       
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee       
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">     
  7.           
  8.     <filter>     
  9.         <filter-name>struts-cleanup</filter-name>     
  10.         <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>     
  11.     </filter>     
  12.           
  13.     <filter>     
  14.         <filter-name>struts2</filter-name>     
  15.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>     
  16.     </filter>     
  17.           
  18.     <filter-mapping>     
  19.         <filter-name>struts-cleanup</filter-name>     
  20.         <url-pattern>/*</url-pattern>     
  21.     </filter-mapping>     
  22.           
  23.     <filter-mapping>     
  24.         <filter-name>struts2</filter-name>     
  25.         <url-pattern>/*</url-pattern>     
  26.     </filter-mapping>     
  27.  
  28. </web-app>    

至此,java中文网整个Struts上传文件源代码整理完了,希望对各位有帮助。

    相关教程
    推荐内容