私が過去にこれを行った最も簡単で最も堅牢な方法は、非表示の 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 が使用されている場合、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
コールバックをトリガーします。