我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

Struts2中实现文件上传(附源码)

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:

<%@ page language="java" pageEncoding="GB18030"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
  
<head>
    
<title>Upload Page</title>
  
</head>
  
<body>
  
<s:form action="upload" method="post" enctype="multipart/form-data">
      
<s:file name="doc" label="File"/>
      
<s:submit value="upload"/>
  
</s:form>
  
</body>
</html>


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

package com;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport
{
    
private static final long serialVersionUID = 4658947796066228597L;
    
private File doc;
    
private String fileName;
    
private String contentType;

    
public void setDoc(File file)
    
{
        
this.doc = file;
    }


    
public void setDocFileName(String fileName)
    
{
        
this.fileName = fileName;
    }


    
public void setDocContentType(String contentType)
    
{
        
this.contentType = contentType;
    }


    @Override
    
public String execute() throws Exception
    
{
        System.out.println(
"fileName:" + fileName);
        System.out.println(
"contextType" + contentType);
        
// 得到当前web工程下的/files目录的在本机的绝对路径,如果没有这个文件夹则会创建
        String targetDirectory = ServletActionContext.getServletContext()
                .getRealPath(
"/files");
        
//重命名上传文件
        String targetFileName = generateFileName(fileName);
        
//在指定目录创建文件
        File target = new File(targetDirectory, targetFileName);
        
//把要上传的文件copy过去
        FileUtils.copyFile(doc, target);
        
return SUCCESS;
    }

    
//重命名上传文件(非必须)
    public String generateFileName(String fileName)
    
{
        String formatDate 
= new SimpleDateFormat("yyMMddHHmmss")
                .format(
new Date());
        
int random = new Random().nextInt(10000);
        
int position = fileName.lastIndexOf(".");
        String extension 
= fileName.substring(position);

        
return formatDate + random + extension;
    }


    
public String getFileName()
    
{
        
return fileName;
    }


}


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

★ 配置文件 struts.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>
<struts>
    
<package name="com" extends="struts-default">
        
<action name="upload" class="com.FileUploadAction">
            
<result name="success">/success.jsp</result>
        
</action>
    
</package>
</struts>    
★ 配置文件 web.xml:
<?xml version="1.0" encoding="UTF-8"?>   
<web-app version="2.4"     
    xmlns
="http://java.sun.com/xml/ns/j2ee"     
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"     
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee     
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>   
        
    
<filter>   
        
<filter-name>struts-cleanup</filter-name>   
        
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>   
    
</filter>   
        
    
<filter>   
        
<filter-name>struts2</filter-name>   
        
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>   
    
</filter>   
        
    
<filter-mapping>   
        
<filter-name>struts-cleanup</filter-name>   
        
<url-pattern>/*</url-pattern>   
    
</filter-mapping>   
        
    
<filter-mapping>   
        
<filter-name>struts2</filter-name>   
        
<url-pattern>/*</url-pattern>   
    
</filter-mapping>   
   
</web-app>   

OK!源码可以我的微软网盘下载.

posted on 2007-11-27 19:49 々上善若水々 阅读(3768) 评论(2)  编辑  收藏 所属分类: Struts2

评论

# re: Struts2中实现文件上传(附源码)  回复  更多评论   

不错,谢谢了,这个例子能用.注释比较详细~
2007-11-28 10:37 | javascript

# re: Struts2中实现文件上传(附源码)[未登录]  回复  更多评论   

赞一个
2015-01-05 15:55 | jack

只有注册用户登录后才能发表评论。


网站导航: