2010-05-18 82 views
0

我們的Web應用程序具有使用Flash(AS3)使用用戶的網絡攝像頭拍照的功能,然後將結果字節數組傳遞給PHP,並在其中進行重構並保存在服務器上。將ActionScript JPG字節數組傳遞給Javascript(並最終傳遞給PHP)

但是,我們需要能夠離線使用此Web應用程序,並且我們選擇了Gears來執行此操作。用戶將應用程序離線,執行任務,然後當他重新連接到服務器時,我們將數據與中央數據庫「同步」。

我們沒有PHP與Flash進行交互了,但我們仍然需要允許用戶拍攝並保存照片。我們不知道如何保存Flash在本地數據庫中創建的JPG。我們的希望是我們可以保存字節數組,一個序列化的字符串,或者實際上堅持對象本身,然後將它傳回PHP或Flash(然後PHP)以重新創建JPG。

我們曾嘗試: - 字節數組傳遞爲Javascript而非PHP,JavaScript的,但似乎並沒有能夠用它做任何事情(對象似乎被剝奪了它的方法) - 字符串化的字節陣列中的閃存,然後將它傳遞給JavaScript中,但我們總是得到相同的字符串:

ÿØÿà 

現在我們正在考慮串行Flash中的字符串,它傳遞給JavaScript,然後在返回路線,通過這串回到Flash,然後將它傳遞給PHP以重建爲JPG。 (噢)。由於我們團隊中沒有人擁有廣泛的Flash背景,我們有點迷路。

序列化的路要走嗎?有沒有更現實的方式來做到這一點?有沒有人有這種事情的經驗?也許我們可以構建一個與AS中的字節數組類相同的JavaScript類?

+0

您的應用程序真的需要在瀏覽器中生活嗎? 使用AIR,您可以讓應用程序在用戶操作系統中本地運行,並在本地保存文件,以便稍後上載/同步,或者將它們作爲斑點保存在SQLite數據庫中。 我知道這可能是構建中的一個重大變化,這就是爲什麼我瘋了一個評論,而不是將其作爲答案;-) – jolyonruss 2010-05-19 11:04:00

+0

你是對的,該應用程序不需要*生活在瀏覽器中,但是在線版本已經編寫並正在運行。另外,應用程序的其餘部分(照片只是一小部分)已被移植並且工作正常。實際上,我們不希望將我們的整個應用程序移至AIR以獲取一項功能。 – Gus 2010-05-19 18:45:50

回答

2

我不確定你爲什麼想在這裏使用Javascript。無論如何,你粘貼的字符串看起來像一個JPG頭的開頭。問題是JPG肯定會包含NULs(字符值爲0)。這很可能會截斷字符串(因爲您發佈的示例似乎就是這種情況)。如果您想「串化」JPG,則標準方法將其編碼爲Base 64.

但是,如果您想在本地保留數據,則可以在Flash中執行此操作。這很簡單,但它有一些限制。

您可以使用本地Shared Object。默認情況下,有100KB的限制,對於圖像文件來說相當不足;不過,您可以要求用戶爲您的應用分配更多空間。在任何情況下,我都會嘗試將圖像存儲爲JPG,而不是原始像素,因爲大小的差異非常有意義。

Shared Objects將透明地處理序列化/反序列化。有一些注意事項:並不是每個對象都可以真正被序列化;對於初學者來說,它必須有一個無參數的構造函數;諸如Sprites,MovieClips等的DisplayObject不起作用。但是,可以序列化一個ByteArray,這樣可以在本地保存JPG(如果用戶允許額外的空間)。你應該使用AMF3作爲編碼方案(我認爲這是默認的);另外,您應該映射您正在序列化的類與registerClassAlias以保留序列化對象的類型(否則它將被視爲Object對象)。您只需在應用程序生命週期中執行一次,但必須在任何讀/寫共享對象之前完成。

沿東西線:

registerClassAlias(「flash.utils。ByteArray「; ByteArray);

我會使用共享對象而不是Javascript。請記住,你很可能不得不要求用戶給你更多的空間來存儲圖像(這似乎是足夠合理的,如果你讓他們脫機工作),並且用戶可以在任何時候(就像他可以刪除其瀏覽器的Cookie)刪除數據。

編輯

我意識到我真的不特別注意「我們選擇了齒輪這樣做」的一部分你的問題。

在這種情況下,您可以嘗試將base 64方法傳遞給JS。從Actionscript方面來說,很容易(抓住許多可用的Base64編碼器/解碼器之一),並且我假設Gear的API必須已經有可用的編碼器/解碼器(或者至少不應該很難找到它)。此時,您可能必須將其變成Blob並將其存儲到磁盤(可能使用BlobAPI,但我不確定,因爲我沒有使用Gears的經驗)。