flex struts2单文件上传、同名文件上传、多文件上传

flexbuilder:3 ,Myeclipse:10.0,struts:2.3.

工程可以在http://download.csdn.net/detail/fansy1990/6621255下载

flex使用FileReference实现单文件上传,使用FileReferenceList实现多文件上传。

1. 单文件上传:

flex单文件上传,一般要经过哪些步骤呢?

(1)初始化一个FileReference对象,并添加SELECT、COMPLETE监听以及对应方法:

fileRef=new FileReference();
				fileRef.addEventListener(Event.SELECT,file_select);
				fileRef.addEventListener(ProgressEvent.PROGRESS,file_progress);
				fileRef.addEventListener(Event.COMPLETE,file_complete);
(2)调用FileReference.browse方法、设置URLRequest,使用FileReference.upload(URLRequest)提交到后台java程序:

fileRef.browse();
uploadUrl=new URLRequest("upload?fileName="+fileNameStr);
fileRef.upload(uploadUrl);
(3)URLRequest设置的是一个action的名称,来看下struts配置吧:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- Add packages here -->
    <constant name="struts.devMode" value="true" />
	
    <package name="actions" extends="struts-default" namespace="/" >

		<action name="upload" class="fz.action.UploadAction" >
            <result>index.jsp</result>
        </action>
        
        <action name="upload_delta" class="fz.action.UploadDeltaAction">
        	<result>flex/Test.html</result>
        </action>
        
         <action name="upload_multi" class="fz.action.UploadMultiAction">
        	<result>flex/Test.html</result>
        </action>
    </package>
    
</struts>
这里的result其实是没有作用的,反正action是不会跳转到success页面的;

看action的配置:

package fz.action;

import java.io.File;
import java.io.IOException;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.*;
import org.apache.struts2.ServletActionContext;

/**
 * 文件上传到 WebRoot/upload目录下面,
 * 若上传同名文件则会替换
 * @author  fansy
 *
 */
public class UploadAction extends ActionSupport {

	private String fileName;
	private File filedata;

	public File getFiledata() {
		return filedata;
	}
	
	/**
	 * 必须定义setFiledata方法才能从流中获得数据,
	 * 应该是struts2的封装
	 */
	public void setFiledata(File filedata) {
		this.filedata = filedata;
		
	}

	public String execute(){
		String path=ServletActionContext.getServletContext().getRealPath("")+"\\upload\\";
		File fileToCreate=new File(path+fileName);
		
		try {
			FileUtils.copyFile(filedata, fileToCreate);
		} catch (IOException e) {
			System.out.println("error:"+e.getMessage());
			
			e.printStackTrace();
		}
		/**
		 * 一定要return null
		 */
		return null;
	}

	public String getFileName() {
		return fileName;
	}

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


}
这里的action有两个属性、fileName和filedata,其中的fileName是flex传过来的,这个名称可以随便,但是filedata确实不行的,正确来讲是必须有一个setFiledata方法来接收来自flex流中的文件数据,这里应该是struts2对这个的封装。所以在调用setFiledata的方法的时候其实是有一个临时文件*.tmp已经在服务器了,execute方法里面只是把这个临时文件拷贝到一个固定目录,同时改变其后缀而已。

可以在setFiledata方法里面设置断点,当执行到这里的时候,查找服务器中有一个临时文件已经生成,setter方法执行完成后,这个临时文件就会被清空了;

最后再来看下web.xml文件配置吧:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <display-name>BlazeDS</display-name>
    <description>BlazeDS Application</description>
	<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- Http Flex Session attribute and binding listener support -->
    <listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
    </listener>
    <!-- MessageBroker Servlet -->
    <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
        <init-param>
            <param-name>services.configuration.file</param-name>
            <param-value>/WEB-INF/flex/services-config.xml</param-value>
       </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- for WebSphere deployment, please uncomment -->
    <!--
    <resource-ref>
        <description>Flex Messaging WorkManager</description>
        <res-ref-name>wm/MessagingWorkManager</res-ref-name>
        <res-type>com.ibm.websphere.asynchbeans.WorkManager</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    -->

</web-app>

2. 同名文件上传

这里其实是和单文件上传一样的,但是比如当用户连着两次上传同一个文件的话,那么之前的文件就会被覆盖掉了,第二个例子就是给用户选择是否要覆盖同名文件的选项,在action中处理也是根据前台flex传来的参数进行相应的处理。这里就不多说了。

3. 多文件上传

这个是直接参考actionscript中的api中的例子改编的,前台的flex基本没有改,要处理的只是action中如何接收的问题。这里接收其实就是setter方法而已,这个调用setter方法的方式很怪,有点类似struts2中的拦截器一样。实际中断点调试,类似下面的调用方式:

* setFiledata-1
 * 		setFiledata-2
 * 			setFiledata-3
 * 				setFileName-1
 * 					setfileName-2
 * 						setfileName-3
 * 			execute-3 filedata、fileName
 * 		execute-2 filedata、fileName	
 * execute-1 filedata、fileName


最后,贴几个截图吧:

单文件上传:

flex struts2单文件上传、同名文件上传、多文件上传_第1张图片


增量上传:


多文件上传:

flex struts2单文件上传、同名文件上传、多文件上传_第2张图片


项目访问路径:http://localhost:8080/FlexServer1.1/   , 首页对应三个链接分别是:单文件、同名文件、多文件上传;



分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990



你可能感兴趣的:(文件上传,struts,Flex)