![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |||||
Форумчанин
Регистрация: 16.05.2024
Сообщений: 143
|
![]() Цитата:
Цитата:
Цитата:
Вся эта белиберда с подставными ссылками делается как раз чтобы никто не смог скачать файл, а скачать мог только тот, кто заранее знает подставное (длинное из случайных символов) имя (ссылку). Иначе какой смысл? То есть подставное имя (ссылку) надо заранее сгенерировать и дать нужному пользователю (только ему одному). И при этом это имя заносится в соответствующую таблицу на сервере. Цитата:
Цитата:
|
|||||
![]() |
![]() |
![]() |
#12 | |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 143
|
![]() Цитата:
Код:
|
|
![]() |
![]() |
![]() |
#13 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,097
|
![]() Цитата:
Настоящие файлы, например, класть в папку files. В папку links записывать файлы-описатели подставных ссылок. Допустим, нужно загрузить на сайт новый файл "документ.txt". Кладём его по ftp в папку files. Так же создаём для него, например, json файл вида: Код:
Когда пользователь обращается по адресу: www.mysite.ru/gfdgfdgd сервер на php лезет в папку links, читает файл gfdgfdgd, смотрит какой реальный файл нужно отдать, не истёк ли срок действия ссылки, тот ли пользователь грузит его и что там нужно ещё проверять. Если всё нормально, то возвращает содержимое файла "документ.txt" из папки files. Цитата:
Можно сделать так, что пользователь по ссылке обращается условно изначально к настоящему файлу: www.mysite.ru/документ.txt только сервер не отдаёт ему сам файл, а показывает страницу с рекламой. Досмотрел рекламу - сервер генерирует сам файлик для подменной ссылки под этот файл с нужным сроком действия и делает redirect уже на www.mysite.ru/gfdgfdgd Ну, можно на сервере ничего не хранить, кроме самих файлов. Указанный выше вариант json'а шифровать, кодировать в base64 и т.д. и отдавать пользователю в качестве ссылки. При обработке запроса соответственно назад расшифровывать и определять какой файл нужно отдать. Но, если кто-то расшифрует такую ссылку, то сможет сам генерировать ссылки и запрашивать нужные ему файлы. |
||
![]() |
![]() |
![]() |
#14 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,736
|
![]()
Тут надо отметить, что file_get_contents читает содержимого файла в память, а далее отдаем его в поток вывода с помощью echo. Подводный камень такого метода: если файл большой, можно не пройти по ограничению на использование памяти.
Более универсальный способ это сначала выяснить размер файла, определить ограничение по памяти, далее читать файл кусками и отдавать тоже кусками. Причем размер куска не должен быть равен ограничению по памяти (так как память будет занята и прочими данными). Можно условно взять половину от ограничения. Хотя в каждом индивидуальном случае надо смотреть на расход памяти. Скажем, ТС указала, что список файлов и хешей хранятся в другом файле, а значит для их сопоставления тот файл тоже должен быть прочитан в память, после чего нужно будет найти реальное имя файла по его хешу. Это все тоже расходует оперативную память. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#15 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 143
|
![]()
to Arigato:
file_get_contents реализован через mmap. Но, конечно, надо поэкспериментировать с большими файлами. Там ещё надо будет правильный content type указывать через @header() |
![]() |
![]() |
![]() |
#16 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,736
|
![]()
Проверил. Вот такой код для проверки:
Код:
По итогу в скаченный 1.zip попадает сообщение об ошибке: Код:
Так что либо ставить жесткий лимит на размер файла, если файл больше, то выдавать в браузер сообщение о том, что такой файл не может быть скачен. Либо отдавать файл кусками. Но приведенная мною функция download($filename) полностью рабочая, если размер файла проходит по лимитам памяти. Возможно, для ТС она подойдет, если у него файлы маленькие. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#17 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 143
|
![]()
Посмотрел исходный текст file_get_contents(), да она создаёт буфер в памяти:
Код:
Но нашёл другую функцию, readfile(), и это, кажется, то что нужно. В документации про неё написано: "readfile() сама по себе не приводит к каким-либо проблемам с памятью, даже при отправке больших файлов. При возникновении ошибки превышения памяти убедитесь, что буферизация вывода отключена с помощью ob_get_level()." Хотя это несколько странно, ведь ob_get_level() не отключает буфер, а отключает ob_end_flush(). Там вот пример такой: Код:
Код:
Вроде как можно ещё функцией fpassthru() вывести файл за раз: Код:
Последний раз редактировалось DeepFlake; 06.02.2025 в 13:51. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ссылка на файл в sql | mchip | Microsoft Office Excel | 5 | 23.03.2016 14:21 |
Ссылка на файл | Апчхи | Microsoft Office Excel | 24 | 16.11.2013 01:34 |
Не получается ссылка на IMG | As_Pushkin | HTML и CSS | 2 | 15.06.2010 21:54 |
Ссылка на файл из текущей папки! Сбор инфы в один файл! | mephist | Microsoft Office Excel | 11 | 10.07.2009 13:51 |
массы n идентичных на вид монет среди которых одна фальшивая - легче или тяжелее остальных | Wintrymoon | Паскаль, Turbo Pascal, PascalABC.NET | 14 | 10.03.2008 23:10 |