Сергей Шлоков

Сергей Шлоков

С нами с 31 января 2013; Место в рейтинге пользователей: #3
Сергей Шлоков
10 июня 2021, 19:50
+2
Вот простейший сниппет, который вызывается на странице modx.local/download?file=dl.txt
if ($modx->user->isAuthenticated('web')) {
    $file = basename($_GET['file']);
    if (!empty($file) && file_exists(MODX_BASE_PATH . "assets/files/{$file}")) {
        header("Location: http://modx.local/assets/files/{$file}");
        exit();
    } else {
        header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
    }
} else {
    return 'Иди отседова.';
}
Скачивается только залогиненным пользователем. Гостю отворот-поворот.
Сергей Шлоков
10 июня 2021, 19:31
+1
А как можно увидеть прямую ссылку? Ты её формируешь на странице download. Пользователь её не видит. А когда файл отдаётся на скачивание, то ссылка тоже не светится.

Вот для примера файл лежит в modx.local/assets/files/.


Т.е. перед тем, как отдать файл, ты проверяешь права. Так что левый пользователь не сможет загрузить его.
Сергей Шлоков
10 июня 2021, 18:48
0
Ясно. Тогда я бы сделал так — для проверенных пользователей выводил бы список файлов. Кликнул «скачать» — идёт переадресация на страницу site.ru/download?file=filename. На ней проверяются права, счётчик и идёт переадресация на статический файл. Nginx нужно настроить на скачивание файлов вместо отдачи. Таким образом, PHP не используется.
Проверил у себя на Apache, работает.
Сергей Шлоков
10 июня 2021, 17:54
+1
Вроде норм. Подсмотреть логику скачиваний можно в FileAttach.
Сергей Шлоков
10 июня 2021, 17:49
0
А если для сравнения отдать как статику? Мне кажется, для раздачи больших файлов сервер слабоват.
Сергей Шлоков
08 июня 2021, 20:06
0
Из документации
readfile() сама по себе не приводит к каким-либо проблемам с памятью, даже при отправке больших файлов. При возникновении ошибки превышения памяти убедитесь, что буферизация вывода отключена с помощью ob_get_level().
Там же в комментациях как отдавать файл частями.

Есть ещё такой вариант.
Сергей Шлоков
08 июня 2021, 09:29
0
Однако не могу сказать что я точно и доподлинно понимаю как работает встроенная функция readfile() в интерпретаторе php.
Выкидывает данные сразу в выходной поток.

Куда именно она читает, как работает с потоком, например видео.
Думаю, как и с любыми другими типами файлов.

Что будет если 10 пользователей запросят на скачивание видео файл размером 12 гигабайт.
Наверно веб-сервер должен тебе ответить на этот вопрос )

Можно попробовать вариант с переадресацией на статический файл — проверил права и редирект на файл. Тут надо смотреть, что оптимальнее.

П.С. Да даже права проверять не нужно — проверяй их перед выводом списка файлов пользователю (лучше настоящие имена не выводить). А по клику переадресация на нормальный файл.
Сергей Шлоков
08 июня 2021, 09:24
0
Можно начать отсюда.
Роман, дальнейшее общение предлагаю перенести в техподдержку магазина modstore.pro.
Сергей Шлоков
08 июня 2021, 08:59
+2
Тыц. Тут тебе и права и скачивание больших файлов.
Сергей Шлоков
07 июня 2021, 18:52
0
это связано с какими техническими трудностями?
Нет, просто разные решения для разных случаев. Невозможно учесть все возможные решения. Всё равно кому-нибудь нужно то, чего нет. Это база. Под свои задачи нужно допиливать. Благо там ничего сложного нет.
Сергей Шлоков
29 мая 2021, 14:35
0
Написать свою форму по аналогии. Можно копи пастом.
Сергей Шлоков
18 мая 2021, 08:50
0
Наверно, нужно предупредить человека, что после этого обновлять компонент нельзя.
Сергей Шлоков
14 мая 2021, 07:25
0
как его сделать активным
Указанный аккаунт активный.
Сергей Шлоков
01 мая 2021, 16:13
+5
Видимо на modhost потихоньку забивают. Я бэкапы не могу скачать. А обновиться можно и старым способом — через setup.
Сергей Шлоков
01 мая 2021, 08:08
+3
Насколько я помню, на modhost последовательная цепочка обновления. Т.е. нельзя перепрыгнуть через версию. Поэтому 2.8.2 по-любому придётся добавлять, чтобы обновиться на 2.8.3. А обновиться на 2.8.2 я очень советую по причине безопасности.
Сергей Шлоков
16 апреля 2021, 12:04
+2
В поздних версиях ExtJs появился тип spinner. А в текущей версии придётся вручную делать. Можно так.
Сергей Шлоков
13 апреля 2021, 21:24
+1
Мерси!
На винде даже предзагрузка на PHP7.4 не работает. Так что, как ты сказал, must have!
Сергей Шлоков
13 апреля 2021, 20:00
0
Ставится. Поэтому нужно осваивать, чтобы использовать все возможности разработки.
Сергей Шлоков
13 апреля 2021, 18:43
0
Но docker — маст хэв. Это ведь не просто самостоятельная технология для какой-то конкретной задачи, это сейчас как фундамент.
Это да. Особенно для пользователей винды (таких как я). Даже Redis не поставишь.