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>
这里其实是和单文件上传一样的,但是比如当用户连着两次上传同一个文件的话,那么之前的文件就会被覆盖掉了,第二个例子就是给用户选择是否要覆盖同名文件的选项,在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
单文件上传:
多文件上传:
项目访问路径:http://localhost:8080/FlexServer1.1/ , 首页对应三个链接分别是:单文件、同名文件、多文件上传;
分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990