結合flex socket以遞迴方式實現多檔案斷點上傳檔案

來源:互聯網
上載者:User

在《Flex與java進行socket通訊完成以斷點續傳方式上傳檔案》中所實現的檔案斷點上傳一次僅能上傳一個檔案,而flex自身不支援多線程,無法進行對多個檔案開啟多個線程進行socket檔案傳輸,即不能迴圈檔案數組來建立多個socket通訊,令每個socket傳輸一個檔案,這樣做僅能上傳一個有問題的檔案。但我們可以採用遞迴方式來達到上傳多檔案的目的,這個過程類似於非同步線程了。

 

建立socket通訊後開始傳輸檔案的過程中flex端監聽三件事情:socket的串連、接收資料和socket通訊的斷開。當斷開通訊時即完成了一個檔案的傳輸,此時如果還有檔案需要傳輸,則可以繼續建立socket通訊,即調用該方法本身進行下一個檔案的傳輸。下述示意程式碼封裝含在一個flex類中。

 

檔案傳輸類中定義全域變數:

//檔案總數量private var fileCount:int = 0;//當前傳輸的檔案索引private var currentIndex:int = 0;//FileReference的數組,即檔案數組private var docList:Array;

 

主函數,用於調用上文中的遞迴函式,進行多檔案傳輸

下文方法參數fileReferenceList為調用該方法的上層類中傳入待上傳的多個檔案的數組

private function uploadDocumentContent(fileReferenceList:Array):void{fileCount = fileReferenceList.length;this.docList = fileReferenceList;if (docList != null && docList.length > 0){this.uploadFile( docList[currentIndex] as FileReference );}}

 

遞迴函式,實現多檔案斷點上傳的核心

private function uploadFile(file:FileReference){var socket = new Socket;socket.connect(CEConstants.SERVERIP,1234); //串連伺服器//監聽是否串連  socket.addEventListener(Event.CONNECT,function conn(){//發送名稱socket.writeUTF(file.name);socket.flush();//檔案大小socket.writeUTF(String(file.data.length));socket.flush();}); //監聽接受資料socket.addEventListener(ProgressEvent.SOCKET_DATA,function receiveData(){//已上傳大小var len:String = socket.readUTF();if(len == "0"){if(file.data.length < 1024){socket.writeBytes(file.data);}else{socket.writeBytes(file.data,0,1024);}socket.flush();}else{if((file.data.length - uint(len)) > 1024){socket.writeBytes(file.data,uint(len),1024);}else{socket.writeBytes(file.data,uint(len),file.data.length - uint(len));}socket.flush();}});//監聽串連關閉  socket.addEventListener(Event.CLOSE,function closeConn(){currentIndex++;if(currentIndex < fileCount){uploadFile(uploadFile( docList[currentIndex] as FileReference ));}else{Alert.show("上傳成功");CursorManager.removeAllCursors(); //去除滑鼠樣式}});}

 

有了上文的工作,即可完成對多個檔案斷點上傳的功能。在此功能之前的動作即為將用戶端的檔案載入到flash player上,即對FileReference等的利用了。值得說明的是雖然Flex自身不支援多線程,但是有一個開源項目async-threading能夠使flex支援多線程,同java的多線程比較,此處為非同步線程。拿多檔案傳輸來說明,如果是多線程的話則多個檔案會同時進行上傳,而採用了此種,則多檔案的上傳不是同時進行的。上文代碼則更為明顯是一個傳輸完後再進行下一個檔案的傳輸,而async-threading就包含類似於時間片的概念了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.