<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 程序人生-天津 閱讀(15340) 評論(1)  編輯  收藏 所屬分類: Flex

    評論

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

    主站蜘蛛池模板: 亚洲成AV人片在线播放无码| 亚洲成综合人影院在院播放| 免费人成在线观看网站品爱网 | 97视频免费在线| 精品国产日韩亚洲一区在线 | 亚洲国产综合第一精品小说| 国产资源免费观看| 日韩免费在线视频| 亚洲色偷偷综合亚洲av78| 亚洲国产婷婷六月丁香| 国内自产拍自a免费毛片| 精品久久久久久无码免费| 国产成人精品日本亚洲11| 亚洲欧洲日产国码无码久久99 | 国产国产人免费人成免费视频 | 中文字幕无线码中文字幕免费 | 99re视频精品全部免费| 另类小说亚洲色图| 亚洲剧情在线观看| 亚洲精品乱码久久久久久按摩| 女人被免费视频网站| 99re视频精品全部免费| a高清免费毛片久久| 亚洲精品无码成人| 99久久亚洲综合精品成人网| 国产乱子伦精品免费女| 思思re热免费精品视频66| 99久久精品毛片免费播放| 久久精品国产亚洲av天美18| 亚洲精品免费在线视频| 亚洲一区无码中文字幕| 国产成人免费一区二区三区| 精品久久久久成人码免费动漫| 13小箩利洗澡无码视频网站免费| 精品免费AV一区二区三区| 色偷偷亚洲女人天堂观看欧| 久久久久亚洲AV无码网站| 亚洲AV午夜福利精品一区二区| 亚洲女同成人AⅤ人片在线观看| 日韩精品视频免费观看| 一二三四视频在线观看中文版免费 |