Инициировать действие при загрузке определенного URL файла - PullRequest
0 голосов
/ 27 апреля 2019

Я хотел бы инициировать действие, когда Apache обнаруживает, что определенный файл URL был запущен для загрузки (или: успешно загружен).

Пример: когда https://example.com/download/token_A6FZ523/myfile.zip загружается клиентом, выполните следующий запрос к базе данных SQLite:

INSERT INTO downloads(date, tokenID) VALUES(CURRENT_TIMESTAMP, "A6FZ523");

Использование: затем на панели инструментов PHP я могу проверить, кто загрузил доставленные файлы.

Я мог бы сделать это следующим образом:

  • запуск сценария каждую минуту на сервере,
  • синтаксический анализ журналов Apache /var/log/apache2/other_vhosts_access.log в поисках шаблона download/token_.*/myfile.zip

  • в этом случае выполнить запрос INSERT INTO

Это кажется довольно сложным, и сам факт запуска скрипта каждую минуту не является приятнымрешение.

Как правильно попросить Apache сохранить информацию в базе данных SQLite "Файл, связанный с маркером загрузки A6FZ523, был загружен клиентом." ? Или, может быть, вместо этого следует использовать PHP?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Я думаю, что ваша проблема заключается в том, что вы напрямую выбираете файл, который хранится на сервере, а не используете 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-типа.

Надеюсь, это должно указать вам правильное направление, хотя :)

1 голос
/ 27 апреля 2019

Если у вас есть доступ к серверу и полномочия для установки, вы можете добавить mod_log_sql и сделать, чтобы apache сохранил журнал непосредственно в таблицу базы данных (он даже анализирует информацию для вас), а затем на своей панели инструментов вы можете просто выполнять простые запросы. Здесь «вещь» показывает, что вам нужно получить имя загрузчика, поэтому вы должны добавить этот «tokenID» в ваш URL и настроить Apache на запрет URL-адреса, если tokenID отсутствует. Вам нужно будет проанализировать tokenID из URL в журнале мысли.

...