2013-09-18 5 views
8

Я хочу создать несколько уникальных ссылок для загрузки для своих пользователей. Причина в том, что я хотел позволить им скачивать только один раз, чтобы они могли использовать обратно ту же ссылку для загрузки снова.Создание уникальной ссылки для загрузки только для загрузки

Я генерирую несколько ключей (например, qwertyasdfghzxcbn. Как и в ссылке для загрузки, это будет как www.xxxxx.com/download.php?qwertyasdfghzxcbn) в базе данных и в поле флага, где, когда пользователь загружает, он обновит 1 до поля флага.

Я сделал поиск в сети и нашел это. http://www.webvamp.co.uk/blog/coding/creating-one-time-download-links/

Но это работает только тогда, когда вы переходите на страницу сначала, тогда только страница будет генерировать уникальную ссылку. Я уже предварительно создал ссылку внутри моей базы данных, мне не нужно снова восстанавливать, если факт, если я сгенерирую ключ, когда пользователь перейдет на страницу, они смогут загружать несколько раз, обновляя страницу.

+0

Я только что проснулся, но где проблема? Почему вы хотите отслеживать их для загрузки только один раз? Многие системы используют время жизни ссылки, поэтому они не спама базы данных, если это не необходимо, и они стараются избегать php/database часто, если файлы больше или есть много файлов. Мой сайт работает следующим образом: пользователь обновляет страницу, уникальная ссылка генерируется с уникальными хэшами статическое слово + время, начинает загрузку active_downloads помечен в БД, пользователь загружает или отменяет файл, сервер удаляет файл из active_downloads. Срок службы связи составляет 5 минут, нигде не сохраняется хешированный ключ. –

ответ

9

Решение будет заключаться в том, чтобы сделать ссылку целевым как скрипт PHP ,

Вы должны скрыть фактический файл где-то недоступным из браузера (т. Е. Где вы можете добраться до файла через fopen(), но не в корне документа) и поместите файл download.php для загрузки файлов.

сам скачать скрипт будет выглядеть примерно так:

$fileid = $_REQUEST['file']; 
$file = file_location($fileid); // you'd write this function somehow 
if ($file === null) die("The file doesn't exist"); 
$allowed = check_permissions_for($file, $fileid) // again, write this 
// the previous line would allow you to implement arbitrary checks on the file 
if ($allowed) { 
    mark_downloaded($fileid, $file); // so you mark it as downloaded if it's single-use 
    header("Content-Type: application/octet-stream"); // downloadable file 
    echo file_get_contents($file); 
    return 0; // running a return 0; from outside any function ends the script 
} else 
    die("You're not allowed to download this file"); 

Любая ссылка вы указываете бы просто указать на download.php FILEID = 712984 (независимо от FILEID на самом деле). Это будет фактическая ссылка для загрузки, поскольку этот скрипт передает файл; но только если пользователю разрешено его получить. Вам нужно будет написать функции file_location(), check_permissions_for() и mark_downloaded().

+1

'readfile()', а не 'echo file_get_contents()'. Еще лучше будет mod_xsendfile для Apache. Если вам не нравится тратить ресурсы, читая файлы в памяти. – deceze

+0

@deceze Я написал 20-секундную реализацию, не пошел и не просмотрел все способы чтения и отправки файла. Я считаю, что ваша функция там лучше, поэтому спасибо за информацию! – aaaaaa123456789

+0

Я вроде как понял. Но я по-прежнему любитель в мире php, есть ли у вас пошаговое руководство или учебник? –

0

Я предложил бы использовать uniqid() функцию, и хранить уникальные идентификаторы с даты истечения срока действия в базе данных, возвращаясь к пользовательскому URL с чем-то вроде этого: ... file_id = $ ID

Когда ссылка открывается, вы можете удалить ее из базы данных или пометить ее для удаления «скоро» (на всякий случай пользователь хочет обновить страницу.)

+0

Есть ли у вас руководства о том, как это сделать? Я понятия не имею. Заранее спасибо. –

+0

Обратите внимание на функцию uniqid(): http://php.net/manual/en/function.uniqid.php – Grzegorz

+0

Как в базе данных, используйте mysql. Конечно, может быть кривая обучения. – Grzegorz

1

Я знаю, что этот вопрос становится немного старым, поэтому приношу свои извинения за добавление к нему сейчас, но если вам удобно работать с API, который я построил http://linkvau.lt, это простой способ создания одноразовых ссылок для скачивания. Поскольку это JSON API, его можно заставить работать с любым языком, но я также предоставляю простую библиотеку PHP для взаимодействия с API.

Смежные вопросы