その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

dojox.form.uploader.plugins.IFrame で問題が生じる原因とその解決方法を書いておく

2012.6.6 追記しました

Dojo のdojox.form.Uploader で詰まったので書いておく - その手の平は尻もつかめるさ
の続きみたいな感じです。

とりあえず今回の諸悪の根源

Dojo(バージョン1.6) のdojo.io.iframe は、「POST メソッドが使える」と公式のドキュメントに書いてあるけど、
どうやら使えないっぽい! 強制的にGET メソッドにされてる感じがする!!


そのお陰でdojox.form.uploader.plugins.iframe を使うと不具合が表出します。
IE だけに現れる不具合かと思ったら、Firefox でもChrome でも発生します。
(FirefoxChrome で意図的にエラーを発生させたい場合は、dojox.form.uploader にforce:"iframe" を指定すると良いでしょう。
ただ、FirefoxChrome でIFrame を使うメリットはほぼ無いと思います。HTML5 を素直に使えば良いと思います)

さておき

最近、Dojo の話題にしか触れていない気がしますがご機嫌如何でしょうか。

先日、「HTML5 に対応してないブラウザでdojox.form.uploader を使いたい時はIFrame プラグインを使うと幸せになれるよー」的な
エントリを書きましたが、それに関連した問題が新たに生じてきたのでそれについて記します。

おや! 405 エラーが出る

dojox.form.uploader をIFrame で利用すると、エラーを吐いて正常に動作しなくなりました。
エラーメッセージには、405 エラーの文字列が。
どうやら、dojox.form.uploader のインスタンスのurl プロパティにセットされている内容の位置にGET メソッドでアクセスを試みた所拒否されたようです。

だったらPOST メソッドを使おう、と言うことでdojox.form.uploader.plugins.iframe のソースコードを見てみると、
(前略)
dojo.io.iframe.send({url:this.getUrl(),form:this.form,handleAs:"json",error:dojo.hitch(this,function(_4){
……
}
(後略)
となっている為、dojo.io.iframe view /dojo/io/iframeを参考にして、
(前略)
dojo.io.iframe.send({url:this.getUrl(),method:"post",form:this.form,handleAs:"json",error:dojo.hitch(this,function(_4){
……
}
(後略)
としてやれば動くんじゃね? と思ってソースを書き換えて再度実行してみたものの、エラーは変わらず。
その上「GET メソッドは駄目です」みたいなメッセージも依然健在。いやいや、ちゃんと'method:"post"'って指定してあるんですが……
(というか、そもそもドキュメントを見ると「method プロパティを指定しなかった場合は、こっちが気を利かせてPOST メソッドをデフォルトに設定してあげるよ!」
と書いてある。いったいなんなんだ……)

そこでこのエントリの上に戻る

ちょっと調べてみると、
internet explorer 8 - dojo.io.iframe.send file upload sends GET request in IE8 - Stack Overflow
IFrameを使った呼び出し: Dojo/JavaScript Toolkitのメモ
Dojo Toolkit - dojo.io.iframe.send ignores method parameter?
と出てくるわ出てくるわ……
これらにも書いてあるように、やっぱりdojo.io.iframe(dojo.io.iframe.send) はPOST メソッドが使えないようです。

解決方法

  • dojo.require('dojox.form.uploader.plugins.IFrame') をdojo.require('dojox.form.uploader.plugins.Flash')に置換する
    • なんだか良く分からないけど、これをするだけで使えるようになります。他の部分は据え置きで。
(補足: ここではFlash のプラグインをrequire していますが、実際に使われるのはFlash ではなくIFrame となっています)

[2012.6.6 追記分]
とてつもない勘違いをした上にとてつもない嘘をつきました。
上記の解決方法で解決すると、IFrame では無くFlash を使ったUploader が実装されます。(昨日、改めて確認しました)
冷静に考えてみたら普通にそうなりますよね……
dojo.form.uploader.plugins.IFrame でPOST メソッドが使えないが為に詰んでいる時には、
dojo.form.uploader.plugins.Flash を使って我慢してね、という事みたいです。
Flash を使ったUploader だと万事解決する(つまり、HTML5 で実装したUploader と同等の働きをする)ので。
[追記ここまで]

もしかしたら、dojox.form.uploader のインスタンスのurl プロパティに「GET メソッドでも参照可能な位置」を渡してあげれば
良いのかも知れませんが、確かめてないので分かりません。(そもそもGET メソッドでも参照可能な位置とは……?)


と言うわけで以上です。お気をつけ下さい。