刚刚终于解决了flex+struts2上传文件的问题,泪奔。。。。。。。。
都是从网上找来的,勿喷
先看下,flex文件:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
?? ??? ??? ??? ?layout="absolute" xmlns="*" creationComplete="init();">
<mx:Script>
?? ?<![CDATA[
?? ??? ?import flash.net.FileReference;
?? ??? ?import mx.controls.Alert;
?? ??? ?import mx.events.CloseEvent;
?? ??? ?import flash.events.*;
?? ??? ?
?? ??? ?private var file: FileReference;
?? ??? ?
?? ??? ?private function init(): void
?? ??? ?{
?? ??? ??? ?Security.allowDomain("*");
?? ??? ??? ?file = new FileReference();
?? ??? ??? ?file.addEventListener(ProgressEvent.PROGRESS,onProgress);
?? ??? ??? ?file.addEventListener(Event.SELECT,onSelect);
?? ??? ??? ?file.addEventListener(Event.COMPLETE,completeHandle);
?? ??? ?}
?? ??? ?
?? ??? ?private function completeHandle(event:Event):void{
?? ??? ??? ?Alert.show("恭喜你,上传成功");
?? ??? ?}
?? ??? ?
?? ??? ?private function upload(): void
?? ??? ?{
?? ??? ??? ?var imageTypes:FileFilter = new FileFilter("Videos (*.mov,*.rmvb,*.flv)","*.mov;*.rmvb;*.flv");
?? ??? ??? ?var allTypes:Array = new Array(imageTypes);
?? ??? ??? ?file.browse(allTypes);
?? ??? ??? ?file.browse();
?? ??? ?}
?? ??? ?private function onSelect(e: Event): void
?? ??? ?{
?? ??? ??? ?Alert.show("上传 " + file.name + " (共 "+Math.round(file.size)+" 字节)?",
?? ??? ??? ?"确认上传",
?? ??? ??? ?Alert.YES|Alert.NO,
?? ??? ??? ?null,
?? ??? ??? ?proceedWithUpload);
?? ??? ?}
?? ??? ?
?? ??? ?private function onProgress(e: ProgressEvent): void
?? ??? ?{
?? ??? ??? ?lbProgress.text = " 已上传 " + e.bytesLoaded
?? ??? ??? ?+ " 字节,共 " + e.bytesTotal + " 字节";
?? ??? ??? ?var proc: uint = e.bytesLoaded / e.bytesTotal * 100;
?? ??? ??? ?bar.setProgress(proc,100);
?? ??? ??? ?bar.label= "当前进度: " + " " + proc + "%";
?? ??? ?}
?? ??? ?
?? ??? ?private function proceedWithUpload(e: CloseEvent): void
?? ??? ?{
?? ??? ??? ?if (e.detail == Alert.YES)
?? ??? ??? ?{
?? ??? ??? ??? ?var request: URLRequest = new URLRequest("FileUpload");
?? ??? ??? ??? ?request.contentType="multipart/form-data";
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?file.upload(request);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?catch (error:Error)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?trace("上传失败");
?? ??? ??? ??? ?}
?? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ?]]>
?? ?</mx:Script>
?? ?<mx:Canvas width="100%" height="100%" x="10" y="170" fontSize="15">
?? ??? ?<mx:VBox width="100%" horizontalAlign="center">
?? ??? ??? ?<mx:Label id="lbProgress" text="上传"/>
?? ??? ??? ?<mx:ProgressBar id="bar" labelPlacement="bottom"
?? ??? ??? ??? ??? ??? ?minimum="0" visible="true" maximum="100" label="当前进度: 0%"
?? ??? ??? ??? ??? ??? ??? ?direction="right" mode="manual" width="200"/>
?? ??? ?
?? ??? ??? ?<mx:Button label="上传文件" click="upload();"/>
?? ??? ?</mx:VBox>
?? ?</mx:Canvas>
</mx:Application>
这个貌似网上很多的,不多说了的。
然后是比较关键的action文件:
public String flexUpLoadFile()
?? ?{
?? ??? ?MultiPartRequestWrapper multiWrapper =
?? ??? ??? ?(MultiPartRequestWrapper) ServletActionContext.getRequest();
?? ??? ?Enumeration fileParameterNames = multiWrapper.getFileParameterNames();
?? ??? ?while (fileParameterNames != null && fileParameterNames.hasMoreElements())
?? ??? ?{??? ?
??????????? // get the value of this input tag??? ?
??????????? String inputName = (String) fileParameterNames.nextElement();??? ?
?? ?
??????????? // get the content type??? ?
??????????? String[] contentType = multiWrapper.getContentTypes(inputName);??? ?
?? ?
??????????? if (isNonEmpty(contentType)) {??? ?
??????????????? // get the name of the file from the input tag??? ?
??????????????? String[] fileName = multiWrapper.getFileNames(inputName);??? ?
?? ?
??????????????? if (isNonEmpty(fileName)) {??? ?
??????????????????? // Get a File object for the uploaded File??? ?
??????????????????? File[] files = multiWrapper.getFiles(inputName);??? ?
??????????????????? if (files != null) {??? ?
??????????????????????? for (int index = 0; index < files.length; index++) {??? ?
??????????????????????????? String uploadPath = "D:"+fileName[index];??? ?
??????????????????????????? File dstFile = new File(uploadPath);??? ?
??????????????????????????? this.copy(files[index],dstFile);??? ?
??????????????????????? }??? ?
??????????????????? }??? ?
??????????????? }???? ?
??????????? }??? ?
??????? }??? ?
?? ??? ?return null;
?? ?}
??? private void copy(File src,File dst) {?????? ?
??????? InputStream in = null;?????? ?
??????? OutputStream out = null;??? ?
?? ?
??????? try {?????? ?
??????????? in = new BufferedInputStream(new FileInputStream(src),UserUtil.BUFFER_SIZE);?????? ?
??????????? out = new BufferedOutputStream(new FileOutputStream(dst),?????? ?
??????????????????? UserUtil.BUFFER_SIZE);?????? ?
??????????? byte[] buffer = new byte[UserUtil.BUFFER_SIZE];?????? ?
??????????? int len = 0;?????? ?
??????????? while ((len = in.read(buffer)) > 0) {?????? ?
??????????????? out.write(buffer,len);?????? ?
??????????? }?????? ?
??????? } catch (Exception e) {?????? ?
??????????? e.printStackTrace();?????? ?
??????? } finally {?????? ?
??????????? if (null != in) {?????? ?
??????????????? try {?????? ?
??????????????????? in.close();?????? ?
??????????????? } catch (IOException e) {?????? ?
??????????????????? e.printStackTrace();?????? ?
??????????????? }?????? ?
??????????? }?????? ?
??????????? if (null != out) {?????? ?
??????????????? try {?????? ?
??????????????????? out.close();?????? ?
??????????????? } catch (IOException e) {?????? ?
??????????????????? e.printStackTrace();?????? ?
??????????????? }?????? ?
??????????? }?????? ?
??????? }?????? ?
??? }
?? ?
??? private static boolean isNonEmpty(Object[] objArray) {??? ?
??????? boolean result = false;??? ?
??????? for (int index = 0; index < objArray.length && !result; index++) {??? ?
??????????? if (objArray[index] != null) {??? ?
??????????????? result = true;??? ?
??????????? }??? ?
??????? }??? ?
??????? return result;??? ?
??? }
struts.xml部分:
<action name="FileUpload" class="com.shangdyu.action.VideoAction" method="flexUpLoadFile">
?????? ??? ?<result>/UpLoad.jsp</result>
</action>
flexUpLoadFile这个函数貌似比较关键,我试过很多的版本都不行,这边可能是这个函数起的作用,先记录下来吧。
?MultiPartRequestWrapper multiWrapper =
?? ??? ??? ?(MultiPartRequestWrapper) ServletActionContext.getRequest();
?? ??? ?Enumeration fileParameterNames = multiWrapper.getFileParameterNames();
它接收到了从flex传过来的文件的内容。
这个真的搞了好久,原来想用blazeds传送文件,但是经过尝试后发现,简直是白痴。struts2果然很强,不管什么都会拦截,然后就会出现说action没有定义的错误,弄得要跳楼了的。原来想自定义拦截器,但是头晕晕的,也不知道行不行,就没弄。
后来几经波折,在网上找到了一篇提问的文章,也是说这个话题。原来没仔细看,篇幅很长,到后面才说问题解决了的。研究了下,果然可以,目前幸福中,哈哈。