FileReader や FormData をサポートしていないブラウザーを使用しているユーザーに正確なフィードバックを提供するというこの問題は、私も非常に悩まされてきました。私は解決策を考え出すために丸3日を費やし、最終的に何もないことに近いものを思いついた.
事実に取り掛かりましょう:
- Browser : IE8/9 // FileReader をサポートしていない他のブラウザーである可能性は低い
- アップロード動作: UX の理由から、「Ajax」である必要があります
- Toolbelt : jQuery ファイルのアップロード*
わかりました、iframe を使用する以外にファイルをアップロードする方法はありません。右?
したがって、@jeferry_to が説明しているように、jQuery Iframe Transport を使用した jQuery ファイルのアップロードは、この仕事のためのツールです。
*実際には、ツール/プラグインは何も変更しません..
今何?
ええと... トランスポート iframe 内の S3 レスポンスにアクセスする必要があります。しかし、別のドメインにあるため、できません。そこで、2 番目の iframe を使用するこのトリックを使用して対処することにしました。
セットアップ:
- TopFrame、私たちのページ (www.myhost.com)
- プラグインによって自動作成された iframe TransportFrame (s3.amazonaws.com) - S3 レスポンスが含まれます
- iframe XDMFrame (s3.amazonaws.com) は、注文時に TransportFrame にアクセスし、応答を取得して TopFrame に配信します。
シナリオ:
まず、jQuery Iframe Transport を変更して、自動生成されたフォームとトランスポート フレームを自動的に削除しないようにする必要があります。これを行う必要があるのは、後で使用する #postMessage が本質的に非同期であり、アクセスしようとするまでに iframe が消えてしまうのを避けるためです。
- TopFrame では、jQuery File Upload を使用してファイルを S3 にアップロードします。アップロードされていることを確認し、それ以外の場合はエラーを取得します。
- TopFrame は #postMessage を使用して XDMFrame にクロス ドメイン メッセージを送信し、TransportFrame の名前を指定します。このメッセージは実際には、「iframe X の内容を確認してください」というメッセージであり、em を私に送り返す場合に表示されます。
- 次に XDMFrame
top.frames['iframe X'].document.documentElement
は、TransportFrame の内容にアクセスし、それらを文字列化し、#postMessage を介して TopFrame に送り返します。
- TopFrame はメッセージを受け取り、適切なフィードバックをユーザーに表示し、jQuery Iframe Transport の変更により残ったフォームと iframe を削除します。
OK、すべてが本によって行われるため、すべてが機能するはずです。
いや、気にする必要さえありません。
ほら...最新のブラウザでXHR2の代わりにiframeトランスポートを使用するように強制すると、上記のソリューションは実際に魅力的に機能します。
しかし、それは無意味です。IE8 + 9 で動作するようにしたいと考えています。
ええと... IE8/9では、うまくいくこともあれば、うまくいかないこともあります。通常はそうではありません。
なんで?IE の分かりやすい HTTP エラー メッセージのためです。ああ、あなたはよく読んでいます。
エラーが発生した場合、S3 はエラー (400、403 など) に応じて HTTP エラーステータスで応答します。現在、ここに示されているように、ステータスと応答の長さに応じて、IE は S3 応答を破棄し、わかりやすいエラー メッセージに置き換えます。これを克服するには、応答が常に > 512 バイトであることを確認する必要があります。この場合、応答を制御できないため、そのようなことを保証することはできません。S3 はそうであり、典型的なエラーは 512 バイト未満です。
要するに:
iframe トリックは、それを必要としないブラウザーでは機能しますが、必要なブラウザーでは機能しません。
残念ながら、他に何も考えられないので、そのケースは現在クローズされています。