стандартных методов Laravel отдать файл. Всегда получаю ошибку
"Symfony \ Component \ HttpFoundation \ File \ Exception \ FileNotFoundException
The file "..." does not exist.
Отдать файл пытаюсь в методе контроллера такими способами:
- return response()->download($link);
и
- return \Illuminate\Support\Facades\Storage::disk(...)->download($link, 'test.txt');
Оба возвращают одну и ту же ошибку. Гуглил - но во всех темах у авторов была проблема при построении ссылки.
Я же перейдя по своей ссылке напрямую в браузере успешно "стартую" скачивание файла. + для чистоты эксперемента попробовал захардкодить ссылку на какой-нибудь общедоступный файл в интернете, чтобы полностью исключить проблему битой ссылки.
Подскажите, пожалуйста, в чем может быть проблема? I
P.S. При этом старый-добрый exit(readfile($link));
успешно работает. То есть, дело точно не в битой ссылке.
Что интересно, после замены return response()->download($link); на return response()->redirectTo($link); ошибка исчезла и файл успешно скачивается. Но это же костыль какой то) Похоже на баг... P.S. версия Laravel - 5.8.
Так $link что содержит, скорее все протокол http тоже, а должен путь до файла на диске.
А зачем файл через вай сервер передавать? Это лишняя нагрузка. А вобще когда то делал так: скачал файл насервер и потом отдавал пользователям. Удалял его не сразу. Это типо кеширования. Если частотзапрашивается файл, то его и храню у себя. Через несколько дней не обращений - удаляю.
Файлы хранятся на s3, но хочу управлять доступом, поэтому, пользователь получает ссылки на мой сервис, а уже отсюда отдаю файл с s3. При этом хотелось бы обойтись без доп. системы управления файлами (следить, чтобы старые удалялись). Пока склоняюсь к варианту exit(readfile($link)). Он и файл отдаёт успешно и на оставляет копию на самом сайте. Боюсь, только на ревью получу по шапке за «не Laravel way” ) Поэтому, круто было бы обнаружить нечего похожее в самом фреймворке.
Readfile не увлекайся. Если музыку отдавать, то еще можно (т.е. до 10мб) а дальше не желательно. Если фильмы, то не используй такое решение.
Не, не, у нас тут текстовые файлы до 5 мегабайт. На оперативку нагрузки большой не должно быть. А я правильно понимаю, что есть только два варианта: - жертвовать оперативной памятью и отдавать с помощью readfile() И - выкачивать предварительно файлы в проект и отдавать уже оттуда, что потребует писать доп. систему удаления устаревших файлов и прочее?
Да. Но с доп системой можно еще разные фишки делать, например, вип пользователям отдачу файлов по скорости не ограничивать. Но в вашем случаи это не нужно. Файлы и так маленькие. У меня был опыт такой. Отдача музыки. Сначала через readfile отдавал, а потом уже переделал под закачку на свой сервер. Ресурсов много економилось. Суточная посещаемость сайта была 8-10к. В пиках сидело и качало около 200-300 чел.
Берешь вот это и голова про кэш не болит: https://flysystem.thephpleague.com/v1/docs/advanced/caching/
А почему нельзя сделать все файлы на с3 не публичными , а пользователю просто отдавать временную ссылку на файл, которая даст скачать файл по ней только один раз, у Амазона есть замечательное СДК для этого 🤷♂️😅
У нас не Амазон, но идея отличная. Спасибо! Посмотрю, есть ли у нашего S3 нечто подобное.
Ясно, на если учесть что все бакеты от других сервисов , типа didgitalocean юзают тулзы написанные под Амазон, только blob azure (говномайкрософт) выделяется в этом плане. Но гугли тогда что типа такого: «[название твоего сервиса] presigned url» - думаю найдёшь. И да, качать файл на машину сервера с бакета для того чтобы отдать его клиенту - это крайне плохая идея и не важно на сколько хороший код ты там напишешь и будет ли он Laravelway...
https://flysystem.thephpleague.com/v1/docs/adapter/aws-s3-v3/ Изучай, Laravel под капотом использует данную либу
Обсуждают сегодня