Как получить файл из хранилища по общедоступному URL?

У меня есть приложение Laravel.

По пути есть хранилище: \storage\app\reports\

Я попытался получить файл через URL-адрес GET, например:

http://localhost:8000/storage/app/reports/report_27-05-19_05.xlsx

Но это не работает для меня.

Также я попытался вернуть файл на стороне сервера:

$file = File::get(storage_path($path.$filename));
$type = File::mimeType($path.$filename);

$response = Response::make($file, 200);
$response->header("Content-Type", $type);

return $response;
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
1 514
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Откройте файл system.php в папке конфигурации.

'reports' => [
        'driver' => 'local',
        'root' => storage_path('app/reports'),
        'url' => env('APP_URL').'/storage/app/reports',
        'visibility' => 'public',
    ],

добавьте это в дисковый массив.

Ведь симлинк наверное работает. Никогда не пробовал, но может сработать. Попробуйте.

И как его использовать?

OPV 28.05.2019 12:39

Как хранить и получать?

OPV 28.05.2019 12:40

Так? ` Storage::disk('reports')->put($path.$filename, $content);` ?

OPV 28.05.2019 12:41

например, в блейд-файлах вы можете вызывать как => reports($file->filename) И да, Storage::disk('reports') можно назначить связанной папке.

Ali Özen 28.05.2019 12:44

Как получить файл по пути? \storage\app\reports\file.xml?

OPV 28.05.2019 12:46

да, 'url' => env('APP_URL').'/storage/app/reports' Вы можете изменить здесь то, что хотите.

Ali Özen 28.05.2019 12:47

Когда я передаю этот URL-адрес в браузер, он пытается применить маршрут

OPV 28.05.2019 12:52
Ответ принят как подходящий

Попробуйте что-нибудь вроде этого.

Следующий пример относится к CSV-файлу, хранящемуся на виртуальном хостинге.

$filename — имя сохраненного файла, который будет передан с get запросом

public function download($filename)
{
    $name = $filename;
    $file = $file = '/home/USERNAME/storage/report/'.$name;

    $header = array(
        'Content-Type' => 'application/csv',
        'Content-Disposition' => 'attachment',
        'Content-lenght' => filesize($file),
        'filename' => $name,
    );

    // auth code
    return Response::download($file, $name, $header);
}

Использование абсолютных путей к каталогу — плохая практика + Content-Type заставляет файл обслуживаться как application/csv. Также нет необходимости отправлять эти дополнительные заголовки. связь

John 28.05.2019 12:56

Да, я знаю, что это плохая практика. Я не смог скачать свой файл, не используя его на виртуальном хостинге. Кроме того, я хотел загружать только csv, когда пользователь вошел в систему. Вот почему я разместил здесь свой старый код. Он был закодирован на Laravel 5.4.

Shubham Pokhriyal 28.05.2019 13:22

Ваши файлы находятся не в той папке, если вы хотите, чтобы они были общедоступны (без контроллера).

Симлинк

Если вы хотите, чтобы ваши файлы были общедоступными.

  1. Переместите файлы в storage/app/public, запустите php artisan storage:link. Это будет символической ссылкой storage/app/public на public/storage. Теперь ваши файлы будут общедоступны на http://localhost:8000/storage/report_27-05-19_05.xlsx

Файл обслуживания

Вы также можете использовать Laravel/PHP для обслуживания файла через ваш контроллер.

  1. Получить файлы через контроллер:
$filename = "Example.docx";
return response()->download(storage_path("app/reports/{$fileName}"));

Да, это работает, но я получаю бинарный файл в ответной сети вместо загрузки файла

OPV 28.05.2019 12:56

Могу ли я получить двоичный ответ в клиенте и открыть его в новом окне с помощью js?

OPV 28.05.2019 12:59

@OPV Если вы получаете двоичный поток вместо загрузки файла, это означает, что что-то не так с конфигурацией вашего веб-сервера. Laravel уже установил правильные заголовки по умолчанию при использовании ответа, функции загрузки.

John 28.05.2019 13:06

Другие вопросы по теме