Найпростіший і надійний спосіб, який я робив це в минулому, - це просто націлити на прихований тег 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 запускають події завантаження для передачі файлів.
Єдиним рішенням, яке знайшов роботу для Chrome, було використання файлу cookie.
Зробити це в основному при запуску / завантаженні:
- [Сторона клієнта] Почніть інтервал, щоб шукати печиво
- [Сторона сервера] Зробіть все, що вам потрібно, з даними файлу
- [Server Side] Встановлення файлу cookie для інтервалу на стороні клієнта
- [Client Side] 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
зворотний виклик.