Действия с файлами в HTML5 осуществляется с помощью File API. Этот стандарт разрешает пользователю выбрать файл и передать его непосредственно коду JavaScript, исполняющемуся на просматриваемой веб-странице.
Операции с файлами логирования (Log Files)
Если нужно просмотреть журналы определенных событий, то можно использовать возможности jQuery и HTML5 File API. По событию onclick на кнопке "Open Log File" считывается содержание журнала и отображается в области просмотра в новом модальном окне. Окно можно закрыть, кликнув по ссылке "Close" или просто в любом месте страницы вне этого модального окна. По событию onclick на кнопке "Save Log File" файл журнала сохраняется на локальном диске.
Показать код
PHP, HTML и JavaScript  
 
<?php
if ($_POST['action'] == 'callThisFunction'){echo executeFunction();}
function executeFunction() {file_put_contents(__DIR__ . '/logfile.log', '');
return 'completed';}
?>

Определение модального окна на странице

<div class="overlay" id="overlay"></div>
<div class="modal" id="modal">
<div class="top_log">
<div style="width:100%; height:1px; clear:both;"></div>
<div style="text-align:left;" class="line_block">Access Log</div>
<div class="line_block" style="text-align:right;"><span id="close" style="cursor:pointer">Close</span></div>
<div style="width:100%; height:1px; clear:both;"></div>
</div><div id="log" class="log" style="text-align:left"></div></div>

Кнопки выбора дейстия

<input type="button" class="log_button" id="open_log" value="Open the Log File">
<input type="button" class="log_button" id="save_log" value="Save the Log File">
<input type="button" class="log_button" id="triggerPhp" value="Clear the Log File">

Открытие модального окна журнала Access Log с данными

<script type='text/javascript'>
$(document).ready(function(){
$('#open_log').click(function(){
$.get("logfile.log").then(function(data) {
$('#log').html(data);
});
$('#overlay').css('display', 'block').animate({opacity:0.7}, 500);
$('#modal').css('display', 'block').animate({opacity:1}, 500);
$('#modal').css('visibility', 'visible');
$('#overlay').css('visibility', 'visible');
});});
</script>

Закрытие модального окна

<script type='text/javascript'>
$(document).ready(function(){
$('#overlay,#close').click(function(){
$('#modal').animate({opacity:0}, 500);
$('#overlay').animate({opacity:0}, 500);
function notdisplay(){
$('#modal').css('visibility', 'hidden');
$('#modal').css('display', 'none');
$('#overlay').css('visibility', 'hidden');
$('#overlay').css('display', 'none');}
setTimeout(notdisplay, 1000);
});});
</script>

Сохранение записей журнала на локальном диске

<script type='text/javascript'>
$(document).ready(function(){
$('#save_log').on('click', function(){
var link = document.createElement('a');
link.setAttribute('href', './logfile.log');
link.setAttribute('download', 'logfile.log');
link.click();
return false;
});
});
</script>

Удаление всех записей в журнале Access Log

<script type='text/javascript'>
$('#triggerPhp').click(() => {
$.alertable.confirm('Журнал Access Log будет очищен без возможности восстановления записей').then(function() {
$.post("logfile.php", {action:'callThisFunction'}, function(response){
console.log(response);
});
});
});
</script>
Правила 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 доступен актуальный список загруженных файлов с учетом общего лимита на сервере.
Область загрузки файла Drag-and-Drop (MAX 2Мбайт)
Файл "" загружен
  OK  
Алгоритм отправки файла перетаскиванием в обозначенную область на странице браузера РС
В первую очередь JavaScript проверяет наличие поддержки браузером нужных функций: window.File, window.FileReader, window.FileList и window.Blob. Если какая либо из функций не поддерживается, то появляется сообщение "File API не поддерживается данным браузером" и процесс загрузки прерывается.
Если все функции поддерживаются, то в процессе выполнения скрипта получаем значения переменных fileName, fileType, fileSize. Далее JavaScript производит проверку файла на соответствие разрешенному размеру и если файл больше чем допустимо, то появляется сообщение о превышении размера и процесс загрузки прерывается. Если все ОК, то производится проверка типа файла по его расширению средствами конструкции "switch" - "case of type".
При выполнении всех условий браузер формирует массив данных multipart/form-data и выполняет POST запрос на сервер, где PHP скрипт как и при стандартной загрузке выполняет проверку безопасности и загружает выбранный файл.
Показать код
JavaScript  
 
<script type='text/javascript'>
$(document).ready(function(){
if (window.File && window.FileReader && window.FileList && window.Blob) {var ok = 'OK';}
else {alert('File API не поддерживается данным браузером');}
if(ok === 'OK'){
const dropZone = document.getElementById('dropZone');
if (dropZone) {
let hoverClassName = 'hover';
dropZone.addEventListener("dragenter", function(e) {
e.preventDefault();
dropZone.classList.add(hoverClassName);
});
dropZone.addEventListener("dragover", function(e) {
e.preventDefault();
dropZone.classList.add(hoverClassName);
});
dropZone.addEventListener("dragleave", function(e) {
e.preventDefault();
dropZone.classList.remove(hoverClassName);
});
dropZone.addEventListener("drop", function(e) {
e.preventDefault();
dropZone.classList.remove(hoverClassName);
const files = Array.from(e.dataTransfer.files);
const fileName = files[0].name;
const fileType = files[0].type;
const fileSize = files[0].size;
$('#lastname').html(fileName);
var size = Math.round(fileSize*10/1024/1024)/10; // -- Оценка размера файла
if(size > 2){
$.alertable.alert('Размер файла '+size+' Мбайт превышает максимально допустимый 2 Мбайт');}
else{
var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
// -- Разрешенные типы файлов
switch (extension) {
case 'jpg':
case 'jpeg':
case 'gif':
case 'png':
case 'webp':
case 'mp3':
case 'ogg':
case 'mp4':
case 'mpeg':
case 'webm':
var type = true;
break;
default: $.alertable.alert('Файл '+fileName+' не разрешен для загрузки на сервер');
}
if(type == true){
if (files.length > 0) {
const data = new FormData();
for (const file of files) {
data.append('file', file);
}
fetch('uploads/', {
method: 'POST',
body: data
})
.then(
setTimeout("$('#uploaded').css('display','block'), $('#uploaded').animate({opacity: 1}, 500)", 1000)
)
.catch(reason => console.error(reason));
}
}}
});
}}
});
</script>

<script type='text/javascript'>
function lastname(){
$('#uploaded').animate({opacity: 0}, 700);
setTimeout("$('#uploaded').css('display','none')", 1000);
}
</script>
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>.
В целом возможны три опции для сохранения файла:
1. Сервер  передает  файл,  используя  его собственное  имя: Скачать
2. Файл при скачивание получает другое имя для сохранения: Скачать
3. Пользователю предлагается определить новое имя  файла: Скачать
 
<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>