目標是一個flash用戶端從本地選擇圖片發送給伺服器,伺服器處理後廣播給所有相關用戶端,這些用戶端顯示這張圖片。
FileReference.browse,聽Event.SELECT取到bytearray,Loader.loadbytes可以取到bitmap
我最早的思路是FileReference.load拿到的資料是bytearray,正好通訊層面上的資料也是bytearray,直接那這個bytearray發送給伺服器,伺服器直接把這個bytearray廣播給用戶端,可是這個bytearray經過了這個旅程後就無法還原為bitmapdata,不知道是確實不能這樣還是因為我對bytearray底層不瞭解的原因。而且通訊時要轉json或者分割字串,圖片型的bytearray轉出來的string是啥"npg/r/n",照理應該是很長的描述顏色數組的資訊,轉出來是這麼短個鳥東西,再還原為bytearray果然是什麼都沒有了。還有粘包。總之這條路就是各種走不通。
正解是發起的用戶端先通過一個服務頁,把圖片上傳到遠端電腦硬碟上,得到一個返回的圖片地址。然後發送給伺服器這個圖片地址,伺服器廣播圖片地址給相關用戶端,這些用戶端下載這張圖片,顯示。具體說,也就是兩次通訊。
第一次通訊:請求一個專門的上傳圖片的服務頁面,用php做服務頁比較流行,比如upload.php。
FileReference.upload(new URLRequest("upload.php")); 聽DataEvent.UPLOAD_COMPLETE_DATA,取到的DataEvent.data就是php頁的返回,所以php頁就要echo出圖片地址,來看這個php頁
$filename = "balabala.png"; //儲存的圖片名稱 可以用時間戳記隨機數遞增數都可以
move_uploaded_file($_FILES['Filedata']['tmp_name'], "./".$filename);
echo($filename);
這樣,在apache目錄下就看到了這張圖片,同時flash得到了圖片名的返回。
關於flash+php的圖片上傳,這篇文章非常完美
http://www.cnblogs.com/ladeng6666/archive/2009/02/17/1392797.html
第二次通訊:發起的用戶端上傳完圖片得到了返回的圖片地址,處理後做socket通訊。
socket.writeBytes(bytes); socket.flush();
伺服器收到訊息廣播,相關用戶端收到圖片地址picurl,去載入這張圖片
var loader:Loader = new Loader();
loader.load(new URLRequest(picurl));
this.addchild(loader);
這邊loader直接是一個displayobject,也可以轉其他顯示類型。