flex 文件上传功能:
为了方便使用,所以自己根据网上一些资料自己写了一个mxml组件:
upload.mxml
如图
代码:
- <mx:Button?x="367"?y="349"???label="浏览..."?cornerRadius="7"?click="selectFile()"/>? ?
-
??<mx:DataGrid?x="12"?y="50"?id="dg"?width="587"?height="291"??dataProvider="{selectedFiles}">? ?
- ????<mx:columns>? ?
-
??????<mx:DataGridColumn?headerText="文件名"?dataField="FILENAME"?width="250"/>? ?
-
??????<mx:DataGridColumn?headerText="大小(KB)"?dataField="FILESIZE"?width="100"/>? ?
-
??????<mx:DataGridColumn?headerText="类型"?dataField="FILETYPE"?width="70"/>? ?
-
??????<mx:DataGridColumn?headerText="上传状态"?dataField=""????width="200">? ?
- ????????<mx:itemRenderer>? ?
- ??????????<mx:Component>? ?
-
????????????<mx:HBox?width="130"?paddingLeft="2"?horizontalGap="2"?horizontalScrollPolicy="off"?verticalScrollPolicy="off">? ?
- ??????????????<mx:Script>? ?
- ????????????????<![CDATA[? ?
-
??????????????????override?public?function?set?data(value:Object):void{? ?
-
????????????????????super.data?=?value;? ?
- ????????????????????progress.setProgress(0,data.fileRefrence.size); ?
- ????????????????????data.fileRefrence.addEventListener(ProgressEvent.PROGRESS,progressHandler);? ?
- ????????????????????data.fileRefrence.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini); ?
- ????????????????????data.fileRefrence.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); ?
- ????????????????????data.fileRefrence.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); ?
- ??????????????????}? ?
- ???????????????????? ?
-
??????????????????private?function?progressHandler(event:ProgressEvent):void{? ?
- ????????????????????progress.setProgress(event.bytesLoaded,data.fileRefrence.size);? ?
-
????????????????????progress.label="已上传:"+Math.round((event.bytesLoaded?*?100?/data.fileRefrence.size))+"%"; ?
- ??????????????????}???? ?
-
??????????????????private?function?ioErrorHandler(event:IOErrorEvent):void{ ?
- ????????????????????outerDocument.lbl_error.text=event.text; ?
- ????????????????????data.fileRefrence.removeEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); ?
- ??????????????????} ?
-
??????????????????private?function?securityError(event:SecurityError):void{ ?
- ????????????????????outerDocument.lbl_error.text=event.message.toString(); ?
- ????????????????????data.fileRefrence.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); ?
- ??????????????????} ?
- ???????????????????? ?
-
??????????????????public?function?fini(event:?DataEvent):void{ ?
-
???????????????????var?retXml:XML=XML(event.data); ?
-
???????????????????var?retCode:int=int(retXml.retCode); ?
-
???????????????????var?retMsg:String=retXml.retMsg; ?
-
???????????????????var?serverDir:String=retXml.serverDir; ?
-
???????????????????if(retCode==1){ ?
- ????????????????????data.STATUS=1;? ?
-
????????????????????data.FILEPATH=serverDir+outerDocument.relativePath+"/"; ?
-
????????????????????data.UPLOADDATE=outerDocument.df.format(new?Date()); ?
- ????????????????????outerDocument.objMain.upLoadSucessFiles.addItem(data); ?
-
?????????????????????progress.label="完成";? ?
- ????????????????????} ?
-
????????????????????else{ ?
- ?????????????????????outerDocument.lbl_error.text=retMsg; ?
- ????????????????????} ?
-
?????????????????????
- ????????????????????data.fileRefrence.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini);? ?
- ????????????????????data.fileRefrence.removeEventListener(ProgressEvent.PROGRESS,progressHandler); ?
-
?????????????????????
- ????????????????????outerDocument.doSave(); ?
- ??????????????????}? ?
- ????????????????]]>? ?
- ??????????????</mx:Script>? ?
-
??????????????<mx:ProgressBar?id="progress"?width="80%"???? ?
-
??????????????????????minimum="0"?maximum="{data.fileRefrence.size}"??mode="manual"? ?
-
??????????????????????labelPlacement="center"?label="{data.READYWORD}"> ?
- ??????????????</mx:ProgressBar>? ?
- ??????????????<!--?取消按钮-->? ?
-
??????????????<mx:LinkButton?id="btncancel"?width="20"?toolTip="取消上传"?click="cancel()"? ?
-
??????????????label="取消"?icon="@Embed('style/assets/icons/cancel.png')">? ?
- ??????????????<mx:Script>? ?
- ??????????????<![CDATA[? ?
-
??????????????private?function?cancel():void{? ?
- ??????????????data.fileRefrence.cancel();? ?
-
??????????????progress.label?=?"已取消";? ?
- ??????????????outerDocument.doSave(); ?
- ??????????????}? ?
- ??????????????]]>? ?
- ??????????????</mx:Script>? ?
- ??????????????</mx:LinkButton>? ?
- ??????????????<!--?删除按钮--> ?
-
??????????????<mx:LinkButton?width="20"?click="deleteItem(event)"??toolTip="从列表中删除"?icon="@Embed('style/assets/icons/delete.png')">? ?
- ????????????????<mx:Script>? ?
- ??????????????????<![CDATA[? ?
-
????????????????????import?mx.collections.ArrayCollection;? ?
- ????????????????????? ?
-
????????????????????private?function?deleteItem(event:MouseEvent):void?{? ?
-
?????????????????????var?dg:Object?=?event.target.parent.outerDocument.dg; ?
-
????????????var?dp:ArrayCollection?=?ArrayCollection(dg.dataProvider); ?
-
????????????var?index:int?=?dp.getItemIndex(data); ?
- ????????????dp.removeItemAt(index);? ?
- ????????????ArrayCollection(dg.dataProvider).refresh(); ?
- ?
- ????????????????????}? ?
- ??????????????????]]>? ?
- ????????????????</mx:Script>? ?
- ??????????????</mx:LinkButton>? ?
- ????????????</mx:HBox>? ?
- ??????????</mx:Component>? ?
- ????????</mx:itemRenderer>? ?
- ??????</mx:DataGridColumn>? ?
- ????</mx:columns>? ?
- ??</mx:DataGrid>? ?
-
??<mx:Label?id="lbl_bytes"?width="495"?color="red"?x="28"?y="10"?text="文件数为:{this.selectedFiles.length},总大小为:{(this.fileListSize/(1024*1024)).toFixed(2)}MB"/> ?
-
??<mx:Label?id="lbl_error"?width="567"?color="red"?x="10"?y="381"?text=""/> ?
-
??<mx:Button?x="448"?y="349"?label="上传"?cornerRadius="7"?id="btn_upload"?enabled="{this.selectedFiles.length>0}"?click="checkFileExist();"?/>? ?
-
??<mx:Button?x="527"?y="349"?label="关闭"?cornerRadius="7"?click="closeWin();"?/>? ?
- ?
-
???
- ?
- ? ?
-
??????private?function?doSingleUploadFile():void{? ?
-
??????????if?(fileList.fileList.length?>?0){? ?
-
????????????var?f:?FileReference?=?fileList.fileList.shift()?as?FileReference;? ?
- ????????????f.addEventListener(Event.COMPLETE,?doSingleUploadFileComplete);? ?
-
????????????f.upload(new?URLRequest(urlRequest));? ?
- ??????????} ?
- ??????}? ?
-
???????
- ?
- ? ?
-
??????private?function?doSingleUploadFileComplete(event:?Event):void{? ?
-
????????var?file:?FileReference?=?event.target?as?FileReference;? ?
- ????????file.removeEventListener(Event.COMPLETE,?doSingleUploadFileComplete); ?
- ????????doSingleUploadFile(); ?
- ??????}? ?
涉及到的JAVA类有:
FileUploadAction.java//文件上传类
?
- import?java.io.File; ?
-
import?java.io.IOException; ?
-
import?java.io.PrintWriter; ?
-
import?java.util.Iterator; ?
-
import?java.util.List; ?
- ?
-
import?javax.servlet.ServletException; ?
-
import?javax.servlet.http.HttpServlet; ?
-
import?javax.servlet.http.HttpServletRequest; ?
-
import?javax.servlet.http.HttpServletResponse; ?
- ?
-
import?org.apache.commons.fileupload.FileItem; ?
-
import?org.apache.commons.fileupload.FileUploadException; ?
-
import?org.apache.commons.fileupload.disk.DiskFileItemFactory; ?
-
import?org.apache.commons.fileupload.servlet.ServletFileUpload; ?
- ?
-
import?org.apache.struts.action.ActionForm; ?
-
import?org.apache.struts.action.ActionForward; ?
-
import?org.apache.struts.action.ActionMapping; ?
-
import?org.apache.struts.actions.DispatchAction; ?
- ?
-
import?com.tydic.osgi.org.springframework.commons.SystemProperties; ?
- ?
-
public?class?FileUploadAction?extends?HttpServlet?{ ?
- ?
-
??
- ?
-
?private?String?uploadPath?=?"d:a"; ?
- ?
-
??
- ?
-
?private?int?maxPostSize?=?100?*?1024?*?1024; ?
- ?
-
?public?FileUploadAction()?{ ?
-
??super(); ?
- ?} ?
-
?public?void?destory(){ ?
-
??super.destroy(); ?
- ?} ?
- ? ?
-
?protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response) ?
-
????throws?ServletException,?IOException?{ ?
- ??doupload(request,?response); ?
- ?} ?
- ? ?
-
?protected?void?doPost(HttpServletRequest?request,?HttpServletResponse?response) ?
-
?????throws?ServletException,?IOException?{ ?
- ??doupload(request,?response); ?
- ?} ?
-
?private?String?getClassSavePath(){ ?
-
??String?SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../"; ?
-
???
-
??return?SavePath; ?
- ?} ?
-
?private?String?getServerPath(){ ?
-
??String?SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../"; ?
-
??SavePath=SavePath.substring(0,SavePath.indexOf("BMP")+4); ?
-
???
-
??return?SavePath; ?
- ?} ?
- ?
-
?public?void?doupload(HttpServletRequest?request,?HttpServletResponse?response) ?
-
???throws?ServletException,?IOException?{ ?
-
??response.setContentType("text/html;charset=UTF-8"); ?
- ?? ?
-
??System.out.println("Access?!"); ?
-
????????response.setContentType("text/html;charset=UTF-8"); ?
-
????????request.setCharacterEncoding("utf-8"); ?
-
????????uploadPath?=?request.getParameter("txtFilePath"); ?
-
????????if("".equals(uploadPath)||null==uploadPath){ ?
- ?????????response ?
- ???.getWriter() ?
- ???.print( ?
-
?????"<?xml?version="1.0"?encoding="utf-8"?><retInfo><retCode>0</retCode><retMsg>上传路径为空</retMsg></retInfo>"); ?
-
????????}else{ ?
-
?????????String?retInfo="上传OK!"; ?
-
?????????String?retCode="1"; ?
-
?????????String?fileName?=?request.getParameter("fileName"); ?
- ?????????String?strDir=getClassSavePath()+uploadPath; ?
- ?????????String?serverDir=getServerPath(); ?
-
?????????????
-
????????????DiskFileItemFactory?factory?=?new?DiskFileItemFactory(); ?
-
????????????factory.setSizeThreshold(4096); ?
-
????????????ServletFileUpload?upload?=?new?ServletFileUpload(factory); ?
- ????????????upload.setSizeMax(maxPostSize); ?
-
????????????try?{ ?
- ????????????????List?fileItems?=?upload.parseRequest(request); ?
- ????????????????Iterator?iter?=?fileItems.iterator(); ?
-
????????????????while?(iter.hasNext())?{ ?
- ?????????????????FileItem?item?=?(FileItem)?iter.next(); ?
-
????????????????????if?(!item.isFormField())?{ ?
- ????????????????????????String?name?=?item.getName(); ?
-
????????????????????????if(!("".equals(fileName))&&null!=fileName){ ?
- ?????????????????????????name?=?fileName; ?
- ????????????????????????} ?
-
????????????????????????try?{ ?
-
?????????????????????????File?dir=new?File(strDir); ?
-
?????????????????????????if(!dir.exists()||!dir.isDirectory()) ?
- ?????????????????????????{ ?
- ??????????????????????????dir.mkdir(); ?
- ?????????????????????????} ?
-
????????????????????????????item.write(new?File(strDir+"/"?+?name));?
- ???????????????????????????? ?
-
????????????????????????}?catch?(Exception?e)?{ ?
- ????????????????????????????e.printStackTrace(); ?
-
????????????????????????????retCode="0"; ?
- ????????????????????????????retInfo=e.getMessage(); ?
-
????????????????????????????throw?new?IOException("文件上传失败"); ?
- ????????????????????????} ?
- ????????????????????} ?
- ????????????????} ?
-
????????????}?catch?(FileUploadException?e)?{ ?
-
????????????????retCode="0"; ?
- ????????????????retInfo=e.getMessage(); ?
- ????????????????e.printStackTrace(); ?
-
????????????????System.out.println(e.getMessage()?+?"结束"); ?
- ????????????} ?
- ????????????response ?
- ??????.getWriter() ?
- ??????.print( ?
-
????????"<?xml?version="1.0"?encoding="utf-8"?><retInfo><retCode>"+retCode+"</retCode><retMsg>"+retInfo+"</retMsg><serverDir>"+serverDir+"</serverDir></retInfo>"); ?
- ????????} ?
- ?? ?
- ?} ?
- } ?
文件下载有两种方式:
?
- <mx:DataGrid??height="99%"?width="99%"?dataProvider="{dgResult}">?? ?
-
???<mx:columns>?
-
???????<mx:DataGridColumn?headerText="文件名"?dataField="FILE_NAME"?width="200"?/>?
-
???????<mx:DataGridColumn?headerText="大小(KB)"?dataField="FILE_SIZE"?width="70"?/>?
-
???????<mx:DataGridColumn?headerText="上传时间"?dataField="STATE_DATE"?width="120"/>?? ?
-
???????<mx:DataGridColumn?headerText="操作"?width="80">?
-
????????<mx:itemRenderer>?
-
?????????<mx:Component>?
-
??????????<mx:LinkButton?label="下载"?icon="{outerDocument.attachIcon}"?click="outerDocument.downloadAttach(data)"/>?
-
?????????</mx:Component>?
-
????????</mx:itemRenderer>?
-
???????</mx:DataGridColumn>???? ?
-
???</mx:columns>??????????? ?
-
??</mx:DataGrid>? ?
- ?
- private?var?fileRef:FileReference; ?
- ?
- ??public?function?downloadAttach(item:Object):void{ ?
-
???//var?str:String=item.FILE_PATH; ?
- ??? ?
- ???//方法一:弹出新容器用java类返回 ?
-
???//var?url:String=serverUrl+downloadAction+"?relPath="+str.substr(0,str.indexOf("/"))+"&filename="+item.FILE_NAME; ?
- ???//navigateToURL(new?URLRequest(url),?"_blank"); ?
- ??? ?
- ???//方法二:用filerefernce ?
-
???var?urlReq:String=serverUrl+item.FILE_PATH; ?
- ???fileRef.download(new?URLRequest(urlReq)); ?
- ??} ?
- ??private?function?initFile():void{ ?
-
???fileRef?=?new?FileReference(); ?
- ?????????fileRef.addEventListener(Event.CANCEL,?doEvent); ?
- ?????????fileRef.addEventListener(Event.COMPLETE,?completeHandler); ?
- ?????????fileRef.addEventListener(Event.OPEN,?doEvent); ?
- ?????????fileRef.addEventListener(Event.SELECT,?doEvent); ?
- ?????????fileRef.addEventListener(HTTPStatusEvent.HTTP_STATUS,?doEvent); ?
- ?????????fileRef.addEventListener(IOErrorEvent.IO_ERROR,?ioErrorHandler); ?
- ?????????fileRef.addEventListener(ProgressEvent.PROGRESS,?processEvent); ?
- ?????????fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR,?doEvent); ?
- ??} ?
- ??private?function?doEvent(evt:Event):void?{ ?
- ????????//?取得当前FileReference的引用 ?
-
????????var?fr:FileReference?=?evt.currentTarget?as?FileReference; ?
- ????????trace("evt?Type:"+evt.type+"evt"+evt.toString()); ?
- ???????} ?
- ???????private?function?processEvent(event:ProgressEvent):void{ ?
-
????????dl_cancel.visible=true; ?
-
????????mydlBar.maximum=event.bytesTotal; ?
- ????????mydlBar.setProgress(event.bytesLoaded,event.bytesTotal);? ?
-
???????????mydlBar.label="已下载:"+Math.round((event.bytesLoaded?*?100?/event.bytesTotal))+"%"; ?
- ???????} ?
- ???????private?function?cancelHandler():void{ ?
- ????????this.fileRef.cancel(); ?
-
????????dl_cancel.visible=false; ?
- ???????} ?
- ???????private?function?completeHandler(event:Event):void{ ?
-
????????mydlBar.label="已完成"; ?
-
????????dl_cancel.visible=false; ?
- ???????} ?
- ???????private?function?ioErrorHandler(event:IOErrorEvent):void{ ?
- ?????????Alert.show(event.text); ?
- ???????} ?
文件下载的java类:
?
- FileDownloadAction.java??
- ?
-
import?java.io.BufferedInputStream; ?
-
import?java.io.BufferedOutputStream; ?
-
import?java.io.FileInputStream; ?
-
import?java.io.IOException; ?
- ?
-
import?javax.servlet.ServletException; ?
-
import?javax.servlet.http.HttpServlet; ?
-
import?javax.servlet.http.HttpServletRequest; ?
-
import?javax.servlet.http.HttpServletResponse; ?
- ?
-
public?class?FileDownloadAction?extends?HttpServlet?{ ?
-
?private?static?final?long?serialVersionUID?=?1L; ?
- ?
-
?protected?void?doPost(HttpServletRequest?request,?
-
???HttpServletResponse?response)?throws?ServletException,?IOException?{ ?
-
??String?fileName?=?""; ?
-
??String?relativePath=""; ?
-
??if?(null?!=?request.getParameter("filename"))?{ ?
-
???fileName?=?request.getParameter("filename"); ?
- ??} ?
-
??if?(null?!=?request.getParameter("relPath"))?{ ?
-
???relativePath=request.getParameter("relPath"); ?
- ??} ?
-
??response.setContentType("application/x-msdownload"); ?
-
??response.setHeader("Content-disposition",?"attachment;filename="?
- ????+?fileName); ?
-
??if?(!"".equals(fileName)?&&?!"".equals(relativePath))?{ ?
-
???String?realPath=getClassSavePath()+relativePath+"/"+fileName; ?
-
???System.out.println("文件路径名:"+realPath); ?
-
???BufferedInputStream?bis?=?null; ?
-
???BufferedOutputStream?bos?=?null; ?
-
???try?{ ?
-
????bis?=?new?BufferedInputStream(new?FileInputStream(realPath)); ?
-
????bos?=?new?BufferedOutputStream(response.getOutputStream()); ?
-
????byte[]?buff?=?new?byte[1024]; ?
-
????int?bytesRead; ?
-
????while?(-1?!=?(bytesRead?=?bis.read(buff,?0,?buff.length)))?{ ?
-
?????bos.write(buff,?bytesRead); ?
- ????} ?
-
???}?finally?{ ?
-
????if?(null?!=?bis) ?
- ?????bis.close(); ?
-
????if?(null?!=?bos) ?
- ?????bos.close(); ?
- ???} ?
- ??} ?
- ?
- ?} ?
-
?private?String?getClassSavePath(){ ?
-
??String?SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../"; ?
-
??return?SavePath; ?
- ?} ?
-
?protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp) ?
-
???throws?ServletException,?IOException?{ ?
- ??doPost(req,?resp); ?
- ?} ?
- ?
- } ?