過去に私がこれを行った最も単純で最も堅牢な方法は、フォームで非表示のiFrameタグをターゲットにすることです。その後、ページをリロードせずにiframe内で送信します。
これは、プラグイン、JavaScript、またはHTML以外の「マジック」の他の形式を使用したくない場合です。もちろん、これをJavaScriptと組み合わせることができます。
<form target="iframe" action="" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<iframe name="iframe" id="iframe" style="display:none" ></iframe>
onLoad
サーバーのエラーまたは成功の応答についてiframeの内容を読み取り、それをユーザーに出力することもできます。
Chrome、iFrame、およびonLoad
-注-アップロード/ダウンロードを行うときにUIブロッカーを設定する方法に興味がある場合にのみ読み続ける必要があります
現在、Chromeは、ファイルの転送に使用されている場合、iframeのonLoadイベントをトリガーしません。Firefox、IE、およびEdgeはすべて、ファイル転送のonloadイベントを起動します。
Chromeで機能することがわかった唯一の解決策は、Cookieを使用することでした。
基本的にアップロード/ダウンロードの開始時にそれを行うには:
- [クライアント側] cookieの存在を探すための間隔を開始します
- [サーバー側]ファイルデータに対して必要なことをすべて実行します
- [サーバー側]クライアント側の間隔にCookieを設定します
- [クライアント側] IntervalはCookieを確認し、onLoadイベントのように使用します。たとえば、UIブロッカーを起動してから、onLoadを(またはCookieが作成されたときに)UIブロッカーを削除できます。
これにcookieを使用することは醜いですが、機能します。
ダウンロード時にChromeのこの問題を処理するためのjQueryプラグインを作成しました。ここで見つけることができます
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
同じ基本原則がアップロードにも適用されます。
ダウンローダーを使用するには(JSを含むことは明らかです)
$('body').iDownloader({
"onComplete" : function(){
$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
}
});
$('somebuttion').click( function(){
$('#uiBlocker').css('display', 'block'); //block the UI
$('body').iDownloader('download', 'htttp://example.com/location/of/download');
});
サーバー側では、ファイルデータを転送する直前にCookieを作成します
setcookie('iDownloader', true, time() + 30, "/");
プラグインはCookieを確認し、onComplete
コールバックをトリガーします。