JAVA & FLEX

          一個分享java和flex開發經驗的空間

             :: 首頁 ::  :: 聯系 ::  :: 管理 ::
            26 隨筆 :: 2 文章 :: 44 評論 :: 0 Trackbacks

              和傳統的JSP一樣,在flex中,有的時候也需要實現文件上傳和下載的功能,但是在flex里文件的上傳和下載的實現相對來說比較復雜,如何實現,請看下面。

              由于flex是一個比較新的技術,在研究的時候,還是按著JSP的方式去嘗試,在開始之初,主要有以下幾種思路:

              A、利用ftp的方式進行文件的上傳和下載,需要利用flex的socket接口。

              B、利用webService的方式來進行文件的上傳和下載

              C、利用flex+sevlet+fileupload組件實現文件的上傳和下載

              在通過比較后,最后選擇了第三種,用Flex+sevlet的方式來完成文件上傳和下載的功能,理由如下(與上面的思路相對應):

              A、涉及到了流的操作,實現起來比較復雜,出現錯誤的幾率比較高

              B、關于flex端的可參考的資料比較少,并且還需要啟動webservice服務

              C、這個技術比較成熟,從flex2.0開始,在flex端已經可以引用FileReference類了,并且在java端有成熟的組件可以使用,所以最后考慮使用該種方法來處理。

          一、文件的上傳

              1、Flex端
                  A、使用到的類介紹:
                      FileReference 類提供了在用戶計算機和服務器之間上載和下載文件的方法。 操作系統對話框會提示用戶選擇要上載的文件或用于下載的位置。它主要能實現一個文件的上傳。
                      FileReferenceList 類提供了讓用戶選擇一個或多個要上載的文件的方法。 FileReferenceList 對象將用戶磁盤上的一組本地文件(一個或多個文件)表示為 FileReference 對象的數組。
                  B、使用 FileReferenceList 類 實現多文件上傳:
                      1) 將該類實例化:var myFileRef = new FileReferenceList(); 
                      2) 調用 FileReferenceList.browse() 方法,該方法將打開一個對話框,讓用戶選擇一個或多個要上載的文件:myFileRef.browse(); 
                      3) 在成功調用 browse() 方法之后,使用 FileReference 對象數組來填充 FileReferenceList 對象的 fileList 屬性。 
                          對 fileList 數組中的每個元素調用 FileReference.upload()

                  代碼如下:

              /**
               * 執行上傳操作
               * 
          */
              
              
          private function upLoadFiles():void
              
          {
                  
          try
                  
          {
                      selectFileList.browse(
          new Array(imageFilter, textFilter));
                      selectFileList.addEventListener(Event.SELECT, selectHandler1);
                  }

                  
          catch (error:Error) 
                  
          {
                      Alert.show(
          "文件選擇出現錯誤,請選擇正確的文件");
                  }

              }

              
          /**
               * 如果文件被選中,則執行該方法
               * 
          */

              function selectHandler1(event:Event):
          void
              
          {
                  var request:URLRequest 
          = new URLRequest("FileUploadServlet");
                  var upLoadFile:FileReference; 
                  var upLoadFileList:FileReferenceList 
          = FileReferenceList(event.target);
                  var selectedFileArray:Array 
          = upLoadFileList.fileList;
                  login 
          =(testPress)(PopUpManager.createPopUp( this, testPress , true));
                  
          for (var i:uint = 0; i < selectedFileArray.length; i++)
                  

                      upLoadFile 
          = FileReference(selectedFileArray[i]);
                      upLoadFile.addEventListener(Event.COMPLETE, UpLoadcompleteHandler);
                      upLoadFile.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
                      
          try
                      
          {
                          upLoadFile.upload(request);
                      }

                      
          catch (error:Error)
                      
          {
                          Alert.show(error.message.toString());
                      }

                  }

              }

              function UpLoadcompleteHandler(event:Event):
          void
              
          {
                   var upLoadFiles:FileReference 
          = FileReference(event.target);
                   var fileNames 
          = upLoadFiles.name;
                   
          //Alert.show('文件'+fileNames+'上傳成功')
                   login.myLabels.text = '文件'+fileNames+'上傳成功';
              }

               
          private function progressHandler(e:ProgressEvent):void
            

              var proc: uint 
          = e.bytesLoaded / e.bytesTotal * 100;  
              login.bar.setProgress(proc, 
          100);  
              login.bar.label
          = "當前進度: " + " " + proc + "%";  
           }
           

          testPress.mxml
          <?xml version="1.0" encoding="utf-8"?>
          <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="528" height="236">
          <mx:Script>
              
          <![CDATA[
                  import mx.managers.PopUpManager;
                  public function clickMe():void {
                      PopUpManager.removePopUp(this);
                  }
              
          ]]>
          </mx:Script>
              
          <mx:ProgressBar id="bar" labelPlacement="bottom" themeColor="#F20D7A"  
          minimum
          ="0" visible="true" maximum="100" label="當前進度: 0%"  
          direction
          ="right" mode="manual" width="200" x="154" y="84"/>  
              
          <mx:Button x="221" y="135" label="關閉" click = "clickMe();"/>
              
          <mx:Label x="173" y="27" id="myLabels" width="157"/>

          </mx:TitleWindow>

              2、JAVA端

               接受Flex端的請求,在JAVA端利用apache的fileupload類庫實現上傳功能。代碼如下:

          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.util.Iterator;
          import java.util.List;
          import java.util.Properties;

          import javax.servlet.ServletContext;
          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 = "D:\\upload\\";
              private String path = "file_path.properties";
              
          private String skStr = "";
              
          private String uploadPath = "";
              
          private int maxPostSize = 1000 * 1024 * 1024;

              
          public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,
                      IOException
              
          {
                  String filePathaa 
          = this.getServletConfig().getServletContext().getRealPath("/");

                  Properties p 
          = loadProperties(path);

                  uploadPath 
          = p.getProperty("filepath");

                  res.setContentType(
          "text/html;charset=UTF-8");
                  req.setCharacterEncoding(
          "UTF-8");

                  DiskFileItemFactory factory 
          = new DiskFileItemFactory();
                  factory.setSizeThreshold(
          1024*20);

                  ServletFileUpload upload 
          = new ServletFileUpload(factory);
                  upload.setSizeMax(maxPostSize);
                  
          try
                  
          {
                      List fileItems 
          = upload.parseRequest(req);
                      Iterator iter 
          = fileItems.iterator();
                      
          while (iter.hasNext())
                      
          {
                          FileItem item 
          = (FileItem) iter.next();
                          
          if (!item.isFormField())
                          
          {
                              String name 
          = item.getName();

                              
          try
                              
          {
                                  File skFile 
          = new File(uploadPath + name);
                                  
          if (skFile.exists())
                                  
          {
                                      skFile.delete();
                                      item.write(
          new File(uploadPath + name));

                                  }

                                  
          else
                                  
          {
                                      item.write(
          new File(uploadPath + name));
                                  }


                              }
           catch (Exception e)
                              
          {
                                  e.printStackTrace();
                              }

                          }

                      }

                  }
           catch (FileUploadException e)
                  
          {
                      e.printStackTrace();
                  }


              }


              
          public Properties loadProperties(String path) throws IOException
              
          {

                  InputStream in 
          = this.getClass().getResourceAsStream(path);
                  
          //

                  Properties p 
          = new Properties();

                  p.load(in);
                  in.close();
                  
          return p;
              }


          }

          還要修正web.xml,添加如下內容

          <!-- For file uploaded -->
             
          <servlet>
                  
          <servlet-name>FileUploadServlet</servlet-name>
                  
          <servlet-class>FileUploadServlet</servlet-class>
              
          </servlet>

              
          <servlet-mapping>
                  
          <servlet-name>FileUploadServlet</servlet-name>
                  
          <url-pattern>/FileUploadServlet</url-pattern>
              
          </servlet-mapping>

          二、文件的下載
              

              調用的方法:private function downLoadFiles(urlAdd:String):void
              參數urlAdd就是用戶的ip地址,如果使用本地的localhost就會產生安全沙箱問題,因此讓用戶自己輸入自己的ip地址。這樣就避免了安全沙箱的問題。如果是本機啟動服務,訪問地址,需要輸入IP,不能用localhost來代替本機的IP地址,否則,還是會出現安全沙箱問題。

               FileReference.download() 方法提示用戶提供文件的保存位置并開始從遠程 URL 進行下載。直接加載請求路徑下載,不需要后臺的支持。代碼如下:

          import com.systex.flex.util.testPress;

          import flash.net.FileReferenceList;

          import mx.controls.Alert;
          import mx.managers.PopUpManager;
              var imageFilter:FileFilter 
          = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)""*.jpg; *.jpeg; *.gif; *.png");
              var textFilter:FileFilter 
          = new FileFilter("Text Files (*.txt, *.rtf, *.zip)""*.txt; *.rtf; *.zip");
              var selectFileList:FileReferenceList 
          = new FileReferenceList();
              var selectedFileArray:Array 
          = new Array();
              var login:testPress 
          = new testPress();
              var downloadURL:URLRequest;
              var DownLoadfile:FileReference; 
          //這是要主要的地方
              
          //http://XX.XX.XX.XX:8080/upload/main.zip
              private function downLoadFiles(urlAdd:String):void
              
          {
                  downloadURL 
          = new URLRequest(urlAdd);
                  DownLoadfile 
          = new FileReference();
                  configureListeners(DownLoadfile);
                  DownLoadfile.download(downloadURL);
              }

               
          private function configureListeners(dispatcher:IEventDispatcher):void {
                  dispatcher.addEventListener(Event.COMPLETE, completeHandler);

              }

              
              
          private function completeHandler(event:Event):void {
              mx.controls.Alert.show(
          "文件下載成功");
              }

          這里的是上面上傳代碼的上部分

          附上測試的MXML

          <?xml version="1.0" encoding="utf-8"?>
          <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
              
          >
          <mx:Script source="UpDownLoadFiles.as"/>

              
          <mx:Canvas width="100%" height="100%" x="10" y="170" fontSize="15">
              
          <mx:VBox width="100%" horizontalAlign="center">
              
          <mx:TextInput id="mytextInput"/>
              
          <mx:Button label="文件下載" click="downLoadFiles('http://'+mytextInput.text+':8080/downLoading/2MSN.rar');"/>
              
          <mx:Button label="上傳文件" click="upLoadFiles();"/>
              
          </mx:VBox>
              
          </mx:Canvas>
          </mx:Application>

          fileupload下載地址就不提供了,請到網上搜尋一下






          posted on 2008-09-18 16:57 程序人生-天津 閱讀(15341) 評論(1)  編輯  收藏 所屬分類: Flex

          評論

          # re: 【心得】Flex中的文件上傳與下載 2009-12-15 19:35
          如果路徑包含中文會出現錯誤  回復  更多評論
            

          主站蜘蛛池模板: 明溪县| 乐昌市| 建湖县| 宽城| 广安市| 锡林浩特市| 友谊县| 西安市| 陕西省| 从江县| 璧山县| 临湘市| 丰城市| 井冈山市| 北碚区| 宿迁市| 侯马市| 临清市| 原阳县| 鄂尔多斯市| 克什克腾旗| 呈贡县| 屏边| 衡南县| 濮阳县| 贡觉县| 突泉县| 政和县| 错那县| 道真| 上虞市| 东兴市| 武功县| 丹巴县| 剑阁县| 无棣县| 山阴县| 黄大仙区| 东台市| 中西区| 长寿区|