Может, я не прав, но мысли возникли следующие:
Веди базу (любую БД или файл), в котором соотносятся некоторые идентификаторы (md5(uniqid(random()))) и имена файлов.
При генерации страницы со ссылкой (например, списка файлов) передаешь юзеру ссылку на скрипт, в параметре - идентификатор.
В том же скрипте заносишь в файл/базу запись типа "идентификатор - файл".
Скрипт "выплевывает" юзеру файл и удаляет идентификатор из файла/базы.
Таким образом, при повторном обращении по ссылке скрипт идентификатора в файле/базе не находит и выдает ошибку.
Плз, сообщи о результатах.