Merhabalar,
Tek kullanımlık indirme linki için size şöyle basit bir çözüm önerebilirim,
İndirme yapılması için gireceğiniz ekranda kullanıcı numarası tabanlı benzersiz bir kod oluşturabilirsiniz.
Örnek vermek gerekirse;

$temp_hash = md5(uniqid($user_id, true));

Bu kodu veritabanındaki, örneğin "download_hash" tablosuna indirilecek dosyanın numarası ile ekleyip , sonrasında oluşturulmuş olan linke tıklayıp , yüklenenler tablosu ile join yapıp gerçek dosya yolunu alarak yine php yardımıyla dosya indirmesi yaptırabilirsiniz.
Örnek PHP kodu aşağıdadır.

$file = "yüklenenler tablosundan gelecek asıl dosya ismi";
$ext = pathinfo($file, PATHINFO_EXTENSION);
header("Content-Disposition: attachment; filename=".$temp_hash.".zip");
header("Content-Length: " . filesize($file));
ob_clean();
ob_end_flush();
readfile($file);

Bu işlemi yapmadan önce de download_hash kodunun durumunu pasif yapabilirsiniz.
Ayrıca kullanıcının numarası(user_id) ile beraber veritabanına ekleme yaparsanız , linki kullanıcı bazlı da yapabilirsiniz.
Bir dahaki indirme denemesinde durum kontrolü yapıp aktif değilse hata mesajı bastırabilirsiniz.
Başka bir kullanıcı veya üye olmayan biri linke tıklasa bile dosyayı indiremeyeceklerdir.

Eğer başarısız olursanız konuda ücretli destek veren arkadaşları da değerlendirebilirsiniz.

Kolay gelsin , başarılar.