Скачивание файла конкретным пользователем

Подскажите, как лучше организовать возможность скачать файл пользователем, чтобы файл для скачивания был доступен не по прямой ссылке, а по сгенеренной случайным образом для конкретного пользователя.
Поиском нашел FileAttach и FILEDOWNLOAD R но там я так понял, что нужно через эти же дополнения и закачивать файлы, а мне желательно условный сниппет
[[!FileDownload? &url=`http://site.ru/files/files.pdf`]]
который генерил бы виртуальную ссылку, по которой качался реальный файл, не раскрывая прямую ссылку.
а сами файлы, мне удобнее через фтп раскладывать.
Андрей
29 апреля 2020, 15:29
modx.pro
1
542
0

Комментарии: 6

Наумов Алексей
29 апреля 2020, 16:35
+1
Создаем значит сниппет FileDownload
В нем любым алгоритмом, который сможете найти по запросу «php обратимое шифрование» зашифровываете имя файла, после чего выводите ссылку /download?file=ЗАШИФРОВАННЫЙ_ПУТЬ
На странице /download другой сниппет читает GET параметр и отдает файл, на эту тему читаем к примеру статью habr.com/ru/post/151795/
    Андрей
    29 апреля 2020, 23:24
    0
    /download?fileid=ЗАШИФРОВАННЫЙ_ПУТЬ
    это получилось. А вот GET параметр хоть убей не могу передать
    пробовал
    [[#GET.fileid]]
    ничего не выдает, а просто
    [[#GET]]
    выдает первые 20 символов, остальное режет.
      Андрей
      30 апреля 2020, 09:23
      0
      вопрос снят, после чистки кэша все заработало
      теперь проблема в другом. создал 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;
      кодирует без проблем, а вот декодировать — выдает пустую строку почему-то
        Андрей
        30 апреля 2020, 11:11
        0
        в общем, проблема решена, нашел другой код для кодирования/декодирования — с ним все получилось
    Сергей Шлоков
    29 апреля 2020, 20:44
    0
    Еще один вариант (по алгоритму Алексея)
    1. Создаем сниппет, в котором формируем уникальный хеш файла.
    2. Записываем в массив
    ['хэш строка' => 'путь/к/файлу']

    3. Сохраняем массив в кэш на определенное время. Если нужно ограничить конечно срок жизни ссылки. Если не нужно, то сохраняем в кэш без ограничений по времени.
    4. На странице загрузки файла проверяем хэш из GET параметра на наличие в массиве из кэша. Есть — отдаем и удаляем из кэша.
      Андрей
      30 апреля 2020, 11:12
      0
      Ваш вариант мне кажется сложнее
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6