Самый простой и надежный способ, которым я занимался в прошлом, - это просто нацелить скрытый тег 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>
Вы также можете прочитать содержимое iframe onLoad
для ошибок сервера или успешного ответа, а затем вывести его пользователю.
Chrome, iFrames и onLoad
-Примечание- вам нужно только продолжать чтение, если вы заинтересованы в том, как настроить блокировщик пользовательского интерфейса при загрузке / загрузке
В настоящее время Chrome не вызывает событие onLoad для iframe, когда оно используется для передачи файлов. Firefox, IE и Edge запускают событие onload для передачи файлов.
Единственным решением, которое я нашел для Chrome, было использование куки.
Чтобы сделать это в основном, когда начата загрузка / выгрузка:
- [Клиентская сторона] Начать интервал, чтобы искать наличие куки
- [Server Side] Делайте все, что вам нужно с данными файла
- [Server Side] Установить cookie для клиентского интервала
- [Сторона клиента] Интервал видит cookie и использует его как событие onLoad. Например, вы можете запустить блокировщик пользовательского интерфейса, а затем onLoad (или при создании cookie) удалить блокировщик пользовательского интерфейса.
Использование куки для этого уродливо, но это работает.
Я сделал плагин jQuery для решения этой проблемы для Chrome при загрузке, вы можете найти здесь
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, "/");
Плагин увидит куки, а затем вызовет onComplete
обратный вызов.