Я думаю, что ваша проблема заключается в том, что вы напрямую выбираете файл, который хранится на сервере, а не используете PHP для программной обработки этого файла. Это не первая проблема, с которой вы столкнетесь при использовании этого метода, вы также не можете проверить безопасность или получить файл из внешнего хранилища файлов (вообще говоря, вы не храните файлы непосредственно на веб-сервере в наши дни!).
Но это просто сделать, если вы знаете, как:)
Во-первых, давайте изменим URL, с которого вы скачиваете файл, на что-то вроде https://example.com/download.php?token=A6FZ523
Итак, мы отправляем переменную GET в скрипт php с именем «download.php». В этом скрипте у вас будет что-то вроде следующего:
<?php
$token = $_GET['token'];
// Get the information about the file from the DB, something like:
// SELECT filename, size, path FROM files WHERE token = $token;
// Giving you $filename, $size and $path
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $size);
echo file_get_contents($path);
// This will be on a completed download
// INSERT INTO downloads(date, tokenID) VALUES(CURRENT_TIMESTAMP, $token);
?>
Когда вызывается файл download.php, токен берется и сопоставляется с информацией файла в БД. Затем вы устанавливаете заголовки, которые в основном говорят браузеру «это файл», ваш браузер отвечает соответственно, осуществляя загрузку файла как обычно. Затем вы читаете содержимое файла пользователю. Как только это будет завершено, вы можете зарегистрировать загрузку через другой вызов БД.
Важно отметить, что этот скрипт (очевидно, с написанными в нем вызовами БД) должен сделать самые базовые для вас, но есть еще много чего добавить в зависимости от вашего сценария использования. Подумайте, безопасность, проверка ввода, где вы храните свои файлы и отправка заголовка MIME-типа.
Надеюсь, это должно указать вам правильное направление, хотя :)