Скачивание файла конкретным пользователем
Подскажите, как лучше организовать возможность скачать файл пользователем, чтобы файл для скачивания был доступен не по прямой ссылке, а по сгенеренной случайным образом для конкретного пользователя.
Поиском нашел FileAttach и FILEDOWNLOAD R но там я так понял, что нужно через эти же дополнения и закачивать файлы, а мне желательно условный сниппет
а сами файлы, мне удобнее через фтп раскладывать.
Поиском нашел FileAttach и FILEDOWNLOAD R но там я так понял, что нужно через эти же дополнения и закачивать файлы, а мне желательно условный сниппет
[[!FileDownload? &url=`http://site.ru/files/files.pdf`]]
который генерил бы виртуальную ссылку, по которой качался реальный файл, не раскрывая прямую ссылку.а сами файлы, мне удобнее через фтп раскладывать.
Комментарии: 6
Создаем значит сниппет FileDownload
В нем любым алгоритмом, который сможете найти по запросу «php обратимое шифрование» зашифровываете имя файла, после чего выводите ссылку /download?file=ЗАШИФРОВАННЫЙ_ПУТЬ
На странице /download другой сниппет читает GET параметр и отдает файл, на эту тему читаем к примеру статью habr.com/ru/post/151795/
В нем любым алгоритмом, который сможете найти по запросу «php обратимое шифрование» зашифровываете имя файла, после чего выводите ссылку /download?file=ЗАШИФРОВАННЫЙ_ПУТЬ
На странице /download другой сниппет читает GET параметр и отдает файл, на эту тему читаем к примеру статью habr.com/ru/post/151795/
/download?fileid=ЗАШИФРОВАННЫЙ_ПУТЬэто получилось. А вот GET параметр хоть убей не могу передать
пробовал
[[#GET.fileid]]
ничего не выдает, а просто[[#GET]]
выдает первые 20 символов, остальное режет.
вопрос снят, после чистки кэша все заработало
теперь проблема в другом. создал 2 сниппета
encrypt
теперь проблема в другом. создал 2 сниппета
encrypt
<?php
$key = 'dfdfdsfsd23';
$decrypted = $path . $decrypted;
$ekey = hash('SHA256', $key, true);
srand(); $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
if (strlen($iv_base64 = rtrim(base64_encode($iv), '=')) != 22) return false;
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $ekey, $decrypted . md5($decrypted), MCRYPT_MODE_CBC, $iv));
return $iv_base64 . $encrypted;
decrypt<?php
$key = 'dfdfdsfsd23';
$ekey = hash('SHA256', $key, true);
$iv = base64_decode(substr($encrypted, 0, 22) . '==');
$encrypted = substr($encrypted, 22);
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $ekey, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv), "\0\4");
$hash = substr($decrypted, -32);
$decrypted = substr($decrypted, 0, -32);
if (md5($decrypted) != $hash) return false;
return $decrypted;
кодирует без проблем, а вот декодировать — выдает пустую строку почему-то
в общем, проблема решена, нашел другой код для кодирования/декодирования — с ним все получилось
Еще один вариант (по алгоритму Алексея)
1. Создаем сниппет, в котором формируем уникальный хеш файла.
2. Записываем в массив
3. Сохраняем массив в кэш на определенное время. Если нужно ограничить конечно срок жизни ссылки. Если не нужно, то сохраняем в кэш без ограничений по времени.
4. На странице загрузки файла проверяем хэш из GET параметра на наличие в массиве из кэша. Есть — отдаем и удаляем из кэша.
1. Создаем сниппет, в котором формируем уникальный хеш файла.
2. Записываем в массив
['хэш строка' => 'путь/к/файлу']
3. Сохраняем массив в кэш на определенное время. Если нужно ограничить конечно срок жизни ссылки. Если не нужно, то сохраняем в кэш без ограничений по времени.
4. На странице загрузки файла проверяем хэш из GET параметра на наличие в массиве из кэша. Есть — отдаем и удаляем из кэша.
Ваш вариант мне кажется сложнее
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.