flex 文件上传与下载

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);
 }

}

FileUploadServlet.class package test; import java.io.File; import java.io.IOException; 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; public class FileUploadServlet extends HttpServlet { // 定义文件的上传路径 private String uploadPath = "G://upload/"; // 限制文件的上传大小 private int maxPostSize = 100 * 1024 * 1024; public FileUploadServlet() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到用户需要保存的服装的id //String dressId = request.getParameter("dressID"); //System.out.println(dressId); // 保存文件到服务器中 response.setContentType("text/html; charset=UTF-8"); 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(); System.out.println(name); try { item.write(new File(uploadPath + name)); } catch (Exception e) { e.printStackTrace(); } } } } catch (FileUploadException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } public void init() throws ServletException { // Put your code here } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值