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