Blueimp Jquery File Upload プラグインを使用してファイルを非同期にアップロードしています。これは他のほとんどのブラウザでうまく機能します(いくつかの小さな問題があります)-IEでは、「完了」、「停止」、「常に」、「完了」、およびその他のイベントコールバックが呼び出されないというこの問題があります。
デバッグ中に、「done」、「fail」、「always」にconsole.logsを追加し、_onSend関数(jquery.fileupload.js内)のajaxリクエストに「complete」メソッドを追加しましたが、いずれも追加しませんでした。 IEで呼び出されるようです。
_onSend: function (e, data) {
var that = this,
jqXHR,
slot,
pipe,
options = that._getAJAXSettings(data),
send = function (resolve, args) {
that._sending += 1;
jqXHR = jqXHR || (
(resolve !== false &&
that._trigger('send', e, options) !== false &&
(that._chunkedUpload(options) || $.ajax(options))) ||
that._getXHRPromise(false, options.context, args)
).complete(function (result, textStatus, jqXHR) {
console.log("complete");
}).done(function (result, textStatus, jqXHR) {
console.log("done", result);
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log("fail", result);
}).always(function (a1, a2, a3) {
console.log("done", result);
}
});
return jqXHR;
};
[読みやすくするためにトリミングされたプラグインコード]
IE 9では、jquery.iframe-transport.jsがファイルのアップロードに使用されることを理解しています(XHRファイルのアップロードはIEではサポートされていないため)。
この問題を修正/デバッグする方法がわかりません。
ありがとう!
サーバーからjsonが返されるときに、応答のcontent-typeが「text/html」または「text/plain」(application/jsonではなく)に設定されている場合、doneイベントが発生します。これは、XHRファイルのアップロードをサポートしていないブラウザー(IE9など)と、blueimpプラグインが代わりにIFrameトランスポートを使用しているブラウザーにのみ適用されます。
プラグインドキュメントの「コンテンツネゴシエーション」の下の関連情報: https://github.com/blueimp/jQuery-File-Upload/wiki/Setup
ちなみに、S3に直接アップロードするときにこの問題が発生しましたが、CORS機能でそれが可能になりました。
解決策は、success_action_statusを「200」に設定することでした。その後、Doneイベントが正しくトリガーされました。
S3への直接アップロードでまだこの問題が発生している場合の解決策は、値が「201」のsuccess_action_statusフィールドを追加することです。一致する必要があるため、ポリシーデータの一部としても含めるようにしてください。
どうやらIE9S3からアップロードを受信すると、空の文字列が返されます。ファイルアップローダーが必要とするXMLを返すようにするには、ステータス201を返すように指示する必要があります。