170 похожих чатов

Доброе утро, ребята! Столкнулся с тем, что не выходит с помощью

стандартных методов 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));
успешно работает. То есть, дело точно не в битой ссылке.

12 ответов

7 просмотров
Sergio-K. Автор вопроса

Что интересно, после замены return response()->download($link); на return response()->redirectTo($link); ошибка исчезла и файл успешно скачивается. Но это же костыль какой то) Похоже на баг... P.S. версия Laravel - 5.8.

Так $link что содержит, скорее все протокол http тоже, а должен путь до файла на диске.

А зачем файл через вай сервер передавать? Это лишняя нагрузка. А вобще когда то делал так: скачал файл насервер и потом отдавал пользователям. Удалял его не сразу. Это типо кеширования. Если частотзапрашивается файл, то его и храню у себя. Через несколько дней не обращений - удаляю.

Sergio-K. Автор вопроса

Файлы хранятся на s3, но хочу управлять доступом, поэтому, пользователь получает ссылки на мой сервис, а уже отсюда отдаю файл с s3. При этом хотелось бы обойтись без доп. системы управления файлами (следить, чтобы старые удалялись). Пока склоняюсь к варианту exit(readfile($link)). Он и файл отдаёт успешно и на оставляет копию на самом сайте. Боюсь, только на ревью получу по шапке за «не Laravel way” ) Поэтому, круто было бы обнаружить нечего похожее в самом фреймворке.

Readfile не увлекайся. Если музыку отдавать, то еще можно (т.е. до 10мб) а дальше не желательно. Если фильмы, то не используй такое решение.

Sergio-K. Автор вопроса

Не, не, у нас тут текстовые файлы до 5 мегабайт. На оперативку нагрузки большой не должно быть. А я правильно понимаю, что есть только два варианта: - жертвовать оперативной памятью и отдавать с помощью readfile() И - выкачивать предварительно файлы в проект и отдавать уже оттуда, что потребует писать доп. систему удаления устаревших файлов и прочее?

Да. Но с доп системой можно еще разные фишки делать, например, вип пользователям отдачу файлов по скорости не ограничивать. Но в вашем случаи это не нужно. Файлы и так маленькие. У меня был опыт такой. Отдача музыки. Сначала через readfile отдавал, а потом уже переделал под закачку на свой сервер. Ресурсов много економилось. Суточная посещаемость сайта была 8-10к. В пиках сидело и качало около 200-300 чел.

Берешь вот это и голова про кэш не болит: https://flysystem.thephpleague.com/v1/docs/advanced/caching/

А почему нельзя сделать все файлы на с3 не публичными , а пользователю просто отдавать временную ссылку на файл, которая даст скачать файл по ней только один раз, у Амазона есть замечательное СДК для этого 🤷‍♂️😅

Sergio-K. Автор вопроса

У нас не Амазон, но идея отличная. Спасибо! Посмотрю, есть ли у нашего S3 нечто подобное.

Ясно, на если учесть что все бакеты от других сервисов , типа didgitalocean юзают тулзы написанные под Амазон, только blob azure (говномайкрософт) выделяется в этом плане. Но гугли тогда что типа такого: «[название твоего сервиса] presigned url» - думаю найдёшь. И да, качать файл на машину сервера с бакета для того чтобы отдать его клиенту - это крайне плохая идея и не важно на сколько хороший код ты там напишешь и будет ли он Laravelway...

https://flysystem.thephpleague.com/v1/docs/adapter/aws-s3-v3/ Изучай, Laravel под капотом использует данную либу

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
Я хочу запустить свой проект в тг. Что-то между пирамидой и майнилкой. Еще подобного ничего не было. Уникальная идея. Нужен именно не бот, а приложение. С ввод, выводом тон...
Павел А.
6
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Реально в одиночку написать игровой движок на Си?
ㅤ (SVO)
11
Всем привет, товарищи! Можете меня поздравить, получил "отлично" за дисциплину "языки программирования низкого уровня". Честно говоря, не очень хочу, чтобы основы асма, которы...
Ыиу
1
Карта сайта