2007年4月22日 星期日

Use dojo for file upload

最近這一兩天都在處理檔案上傳的部分,對於基本的檔案上傳功能利用Jakarta Commons FileUpload就可以達成,但是要使用ajax的時候我選擇了dojo作為我的web ajax框架。通常在看完dojo的demo後,真是另我感到驚為天人。這麼樣的方便,看起來是省下一些非同步呼叫的語法。

基本上一開始我直接參考的Ajax教學是IBM的一系列Ajax文章,當然你也可以有其他的選擇,像是ajax學習筆記。後來真的開始撰寫我的web form時,是直接使用dojo。dojo是個框架,他是個不錯用的框架,當然也提供一些widget可以使用。在看完dojo getting started的Hello World後,想必對dojo.io.bind();的使用有一定的了解。但是納悶的是如何才能使用upload的傳輸呢transport?很早 Alex's file upload with dojo 已經說明了一個簡單的方法就可以使用dojo.io.bind()來處理有file field的form了。這點非常不容易,他述說上只要加上
dojo.require("dojo.io.IframeIO");
的宣告就可以了。而為何只是一般的dojo.io.bind()無法處理有檔案傳輸的form這點可以參考dojo book Introduction to dojo.io.bind 或Alex所述, XMLHTTP transport無法處理file 傳輸,這點就可以透過dojo的 IframeIO來處理了。但事實上還是發生一些問題,在我實際的使用上發現,問題還有為解決。一開始未加入IframeIO宣告時,是按鈕下去連傳都沒傳就會說錯誤,但是簡單宣告IframeIO後,是可以傳輸給server去作處理了。結果檔案也成功接收獲得,但是在dojo 的callback處理時,就是一直出現error: [object ],這點在Alex上得留言也知道有些人發生,討論的也很熱烈。就是得不到一個完整的解決方式。其中也從

http://download.dojotoolkit.org/release-0.2.2/dojo-0.2.2-ajax/tests/io/test_IframeIO.html

測試IframeIO,結果也一樣有error [object] 回傳處理問題,最後也得知這是一個bug。可以手動從iframe讀取資料。不過當然還有一些細節,server response需要把minetype 從 text/plain 改成 text/html ,再來處理結果的回傳,在server還要以textarea包覆起來。而回傳成html之後,在從iframe中取出textarea的質處理即可。看起來就像:
dojo.io.bind({

formNode: dojo.byId( 'myForm' ),

mimetype: 'text/html',

load: function(type, doc) {
window.alert( doc.getElementsByTagName('textarea' )[0].value );
}

error: function(type, err) {
window.alert("Failure:" + err.message);
}

});
但不要忘了加上一個隱藏的iframe在網頁中,而form的target指向他。
如此就終於可以用dojo來正常運作了。

在此因為dojo跟 file upload有關的中文文章很少,一直沒有很好的實際 source code來參考。搞不好已經有新的解決方式,至少現在我可以正常的處理我的 file upload 和 IframeIO return 了。
而之前一直在傳輸完檔案後的錯誤,的確是因為minetype 設成 text/plain就不行了。

沒有留言: