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()+"../../";
- //String path_name = SystemProperties.getProperty("UPLOAD_PATH");
- return SavePath;
- }
- private String getServerPath(){
- String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";
- SavePath=SavePath.substring(0,SavePath.indexOf("BMP")+4);
- //String path_name = SystemProperties.getProperty("UPLOAD_PATH");
- 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, 0, 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);
- }
- }