2010年11月9日 星期二

flash10 上傳圖片的問題

flash10 上傳圖片的問題

最近開發某個專案時會用到 flash 上傳圖片的功能,
以往 flash 不管是 as2/as3 要進行上傳圖片,
都沒什麼問題,這次居然發生不能上傳的狀況,
其實之前同事也有預到過同樣的情形,
不過一忙就沒 trace 下去,
今天就徹底把問題找出來一次解決。

先描述一下此問題發生的狀況,
當使用者按下 upload 時 js 會透過 ExternalInterface 呼叫
flash function 進行上傳,就會跳出下列訊息:

SecurityError: Error #2176: 特定動作 (像是顯示彈出式視窗的動作) 只能透過使用者互動叫用,例如滑鼠按下或按下按鈕等等。
at flash.net::URLStream/load()
at flash.net::URLLoader/load()
at pages::HomePage/sendPhotoData()
at pages::HomePage/fromJs_upload()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at flash.external::ExternalInterface$/_callIn()
at Function/<anonymous>()

看這訊息,"特定動作"這到底是指什麼,我也沒開 file browse 彈出式視窗,
我只是要上傳 BitmapData....0rz
而且印象中一堆 swfupload/ajax-uploader/YUI Uploader
都用這種方式(js->flash)來上傳檔案。

請教 google 大神後發現這是 flash10 做的安全性改變,
http://www.adobe.com/devnet/flashplayer/articles/fplayer10_uia_requirements.html
其中 POST APIs 有提到以 RFC1867(Form-based File Upload) 的方式上傳,需要使用者主動 click 才有效。

那要怎麼解決呢?總不能都降回 flash9 吧~~

方法一:Base64
將圖片用 base64 編碼再用 POST 的方式送出,
缺點是 size 會變大 1/3 ,
不過目前上傳圖片都不大,這個缺點也就還能接受。
as3:
php:

方法二:amf
沒錯,沒看錯,用 amf 的方式傳輸就沒這個問題,
真不曉得 adobe 在搞什麼。
不過 .Net 上的 amf 我不熟悉這邊就略過,
amfphp/zendAmf 等有時間再另開一篇來說明吧。

[update:20120606]
方法三:
避開發生問題的 request header "Content-Type" of "multipart/form-data"
as3:
php:

缺點:
一次只能傳一張照片,
如果要帶參數,只能用 GET 的方式帶在 url 後面,有點小麻煩。

沒有留言:

張貼留言