Действия с файлами в HTML5 осуществляется с помощью File API. Этот стандарт разрешает пользователю выбрать файл и передать его непосредственно коду JavaScript, исполняющемуся на просматриваемой веб-странице. |
| Операции с файлами логирования (Log Files) |
Если нужно просмотреть журналы определенных событий, то можно использовать возможности jQuery и HTML5 File API. По событию onclick на кнопке "Open Log File" считывается содержание журнала и отображается в области просмотра в новом модальном окне. Окно можно закрыть, кликнув по ссылке "Close" или просто в любом месте страницы вне этого модального окна. По событию onclick на кнопке "Save Log File" файл журнала сохраняется на локальном диске. |
Показать код
|
| Правила CSS для создания модального окна просмотра Log Files |
.overlay { opacity: 0; visibility: hidden; display:none; position: fixed; top:0; left:0; width:100%; height:100%; background-color: #fff; z-index:20; transition:0.3s all; } .log { max-height:500px; font-size:10pt; overflow-y: scroll; padding-right:15px; } .modal {opacity:0; visibility: hidden; display:none; min-width:810px; max-width:810px; position:fixed; top:50%; left:50%; transform: translate(-50%, -50%); z-index:30; box-shadow: 0 3px 10px -.5px rgba(0, 0, 0, .9); text-align: center; padding: 10px; padding-left:20px; padding-right:12px; border-radius: 5px; background-color: #fff; color:#333; transition: 0.3s all; } .line_block { width:400px; height:32px; float:left; font-size:13pt; } |
|
Отправка файлов с локального компьютера
В HTML5 предусмотрен вариант загрузки перетаскиванием одного или нескольких файлов в выделенную для загрузки область Web-страницы методом Drag-and-Drop.
При этом на локальном компьютере сразу выполняется проверка размера и соответствия допустимого типа файла. Для демонстрационных целей на сайте предполагается отправка только картинок и маленьких медиафайлов.
По ссылке Uploads Overview доступен актуальный список загруженных файлов с учетом общего лимита на сервере. |
|
| Алгоритм отправки файла перетаскиванием в обозначенную область на странице браузера РС |
В первую очередь JavaScript проверяет наличие поддержки браузером нужных функций: window.File, window.FileReader, window.FileList и window.Blob. Если какая либо из функций не поддерживается, то появляется сообщение "File API не поддерживается данным браузером" и процесс загрузки прерывается.
Если все функции поддерживаются, то в процессе выполнения скрипта получаем значения переменных fileName, fileType, fileSize. Далее JavaScript производит проверку файла на соответствие разрешенному размеру и если файл больше чем допустимо, то появляется сообщение о превышении размера и процесс загрузки прерывается. Если все ОК, то производится проверка типа файла по его расширению средствами конструкции "switch" - "case of type".
При выполнении всех условий браузер формирует массив данных multipart/form-data и выполняет POST запрос на сервер, где PHP скрипт как и при стандартной загрузке выполняет проверку безопасности и загружает выбранный файл. |
Показать код
|
| PHP скрипт загрузки на стороне сервера |
| Загрузка файлов в PHP базируется на взаимодействии клиента и сервера по протоколам HTTP/HTTPS. Браузер пользователя формирует многочастный запрос (multipart/form-data), который передаёт содержимое файла на сервер. Скрипт PHP обрабатывает этот запрос и предоставляет доступ к файлу через суперглобальный массив $_FILES. |
Для исключения неправомерного доступа к загрузке файлов через внешнюю подставную Web-страницу здесь реализовано решение на PHP, которое исключает внешний доступ к загрузке минуя оригинальный ресурс. |
| PHP Server Script |
Блокировка Invalid Remote Request $server = $_SERVER['SERVER_NAME']; $valid_url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $server . '/files.php'; $valid_url = explode('?', $valid_url); $valid_url = $valid_url[0]; $referer = $_SERVER["HTTP_REFERER"]; if($referer !== $valid_url){ $invalid_url = "../invalid_url.log"; ffile_put_contents($invalid_url, PHP_EOL . "Attempt at an Invalid Remote Request to uploads | $date | Remote IP address: $remote_addr | Referer: $referer ", FILE_APPEND); die('<html><head><title>Forbidden</title></head><body><h1>Forbidden</h1></body></html>');} Загрузка файла if ($_FILES && $_FILES["file"]["error"]== UPLOAD_ERR_OK) { $name = "./" . $_FILES["file"]["name"]; move_uploaded_file($_FILES["file"]["tmp_name"], $name); } |
| Отдача файлов на скачивание в браузере | ||||||
С появлением атрибута download у ссылок, появилась возможность указать браузеру что файл в href="" нужно сохранить на диске. Синтаксис такой ссылки: <a href="адрес файла на сервере" download>Ссылка</a>. |
||||||
В целом возможны три опции для сохранения файла:
|
<a href="sources/html5.png" download>Скачать</a> <a href="sources/html5.png" download="Newhtml5.png">Скачать</a> <a href="sources/html5.png" download="Укажите_новое_имя.png">Скачать</a> |
Если нужно запустить скачивание файла по кнопке, то можно использовать jQuery. По событию onclick у кнопки создается ссылка с атрибутом download и затем по ней происходит программный клик. |
Также можно получить файл через AJAX и запустить его скачивание. Это очень полезно в случае, если файл генерируется на лету с переданными ему GET/POST параметрами. |
| jQuery и AJAX |
Использование jQuery <script> $('#jq-download').on('click', function(){ var link = document.createElement('a'); link.setAttribute('href', 'sources/download.png'); link.setAttribute('download', 'jQuery-download.png'); link.click(); return false; }); </script> Использование AJAX <script> $('#ajax-download').on('click', function(){ $.ajax({ url: 'sources/download.png', dataType: 'binary', xhrFields: { 'responseType': 'blob' }, success: function(data, status, xhr) { var blob = new Blob([data], {type: xhr.getResponseHeader('Content-Type')}); var link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = 'AJAX-download.png'; link.click(); } }); }); </script> |
