Да, мой предпочтительный способ сделать это - через PHP. Вы должны установить скрипт, который будет загружать файл и отправлять его в браузер пользователя. Этот сценарий также может где-то регистрировать загрузку (например, вашу базу данных).
Например - в очень грубом псевдокоде:
download.php
$file = $_GET['file'];
updateFileCount($file);
header('Content-Type: image/jpeg');
sendFile($file);
Тогда у вас просто есть ссылка для скачивания на download.php вместо реального файла. (Обратите внимание, что updateFileCount и sendFile - это функции, которые вы должны будете предоставить, конечно - этот скрипт является примером скрипта загрузки, который вы можете использовать)
Примечание. Я настоятельно рекомендую избегать использования $ _GET ['file'] для получения всего имени файла - злоумышленники могут использовать его для получения конфиденциальных файлов с вашего веб-сервера. Но безопасное использование загрузок PHP - тема для другого вопроса.