Laravel получает изображения из хранилища для просмотра

Я использую приведенный ниже код для хранения загруженного файла

 $file = $request->file($file_attachment);
        $rules = [];
        $rules[$file_attachment] = 'required|mimes:jpeg|max:500';
        $validator = Validator::make($request->all(), $rules);
        if ($validator->fails()) {
            return redirect()->back()
                ->with('uploadErrors', $validator->errors());
        }

        $userid = session()->get('user')->id;
        $destinationPath = config('app.filesDestinationPath') . '/' . $userid . '/';
        $uploaded = Storage::put($destinationPath . $file_attachment . '.' . $file->getClientOriginalExtension(), file_get_contents($file->getRealPath()));

Загруженные файлы хранятся в хранилище / приложение / 2 / имя_файла.jpg

Я хочу показать пользователю загруженный им файл. Как я могу это сделать?

$ storage = Storage :: get ('/ 2 / filename.jpg');

Я получаю нечитаемые тексты. Могу подтвердить, что файл прочитан. Но как показать это как изображение пользователю.

Надеюсь, я ясно изложил свою точку зрения.

Рабочее решение

display.blade.php

<img src = "{{ URL::asset('storage/photo.jpg') }}" />

web.php

Route::group(['middleware' => ['web']], function () {
    Route::get('storage/{filename}', function ($filename) {
        $userid = session()->get('user')->id;
        return Storage::get($userid . '/' . $filename);
    });
});

Спасибо: @Boghani Chirag и @rkj

Вы пытались создать символическую ссылку на папку для хранения изображений из общей папки? Затем получить доступ к URL-адресу оттуда? (может потребоваться некоторая конфигурация nginx / apache, чтобы разрешить символическую ссылку на каталог) И хотя я не рекомендую это, попытался сохранить его в общей папке. Лично я предпочитаю загружать изображение после его обработки в какой-нибудь cdn или поставщик изображений, например cloudinary, и передавать URL-адрес от них.

Charis 23.06.2018 05:23

Нет, я не могу этого сделать. Информация о пользователе более конфиденциальна, и я не могу поместить ее в общую папку или облачный ...

Alaksandar Jesus Gene 23.06.2018 05:42

Понятно, а как насчет того, чтобы использовать его как data-uris? Передать пользователю с помощью тега img: css-tricks.com/data-uris

Charis 23.06.2018 05:49

вы можете сохранить имя файла в db, а затем вы можете легко найти путь для отображения в файле лезвия

Nirali 23.06.2018 06:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
10
4
37 439
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Можете ли вы попробовать это

$storage = Storage::get(['type_column_name']);

что такое type_column_name

Alaksandar Jesus Gene 23.06.2018 06:27

Имя столбца вашей таблицы, где путь к сохраненному изображению

Rohit Jadhav 25.06.2018 04:40

Попробуй это:

Storage::disk('your_disk_name')->getDriver()->getAdapter()->applyPathPrefix('your_file_name');

Удачи !

какое здесь ваше_имя_диска

Alaksandar Jesus Gene 23.06.2018 06:27

это поможет вам узнать, что laravel.com/docs/5.6/filesystem#the-public-disk

Gautam Patadiya 23.06.2018 06:29
Ответ принят как подходящий

File not publicly accessible like you said then read file like this

$userid = session()->get('user')->id;
$contents = Storage::get($userid.'/file.jpg'); 

Предполагая, что ваш файл находится по пути storage/app/{$userid}/file.jpg и диск по умолчанию - local проверьте config/filesystems.php

File publicly accessible

Если вы хотите сделать свой файл общедоступным, сохраните файл в этой папке storage/app/public. Вы можете создавать в нем подпапки и загружать их туда. После того, как вы сохраните файл внутри storage/app/public, вам нужно просто создать символическую ссылку, и в laravel есть для нее команда artisan.

php artisan storage:link

Это создает символическую ссылку storage/app/public на public/storage. Значит, теперь вы можете получить доступ к своему файлу вот так

$contents = Storage::disk('public')->get('file.jpg'); 

здесь физический путь к файлу находится на storage/app/public/file.jpg, и доступ к нему осуществляется через путь символьной ссылки public/storage/file.jpg

Предположим, у вас есть подпапкаstorage/app/public/uploads, где вы храните свои загруженные файлы, вы можете получить к нему доступ следующим образом

$contents = Storage::disk('public')->get('uploads/file.jpg');

When you make your upload in public folder then you can access it in view

echo asset('storage/file.jpg'); //without subfolder uploads

echo asset('storage/uploads/file.jpg');

подробности уточняйте https://laravel.com/docs/5.6/filesystem#configuration

Можете ли вы попробовать этот код

routes.php

Route::group(['middleware' => ['web']], function() {
    Route::get('storage/storage_inner_folder_fullpath/{filename}', function ($filename) {
        return Image::make(storage_path() . '/storage_inner_folder_fullpath/' . $filename)->response();
    });
});

просмотреть код файла

<img src = "{{ URL::asset('storage/storage_inner_folder_fullpath/'.$filename) }}" />

Спасибо

Что такое «Изображение»? Вы не указали определение.

Vlad Vladimir Hercules 17.05.2019 20:19

Не забудьте поместить свою папку в хранилище / app / public /

Создайте символическую ссылкусимвольную ссылку для доступа к этой папке

php artisan storage:link

если вы хотите получить доступ к изображениям профиля из 2 папок, сделайте это в своем файле лезвия

<img src = "{{ asset('storage/2/images/'.$user->profile_image) }}" />

Загружено вот так

$uploadedFile = $request->file('photo');
$photo = "my-prefix" . "_" . time() . "." . $uploadedFile->getClientOriginalExtension();
$photoPath = \Illuminate\Support\Facades\Storage::disk('local')->putFileAs(
   "public/avatar",
   $uploadedFile,
   $photo
);

а затем получить доступ вот так

<img src = "{{ asset('storage/avatar/'.$filename) }}" />

Laravel 8

Контроллер

class MediaController extends Controller
{ 

    public function show(Request $request, $filename)
    {
        $folder_name = 'upload';

        $filename = 'example_img.jpeg';

        $path = $folder_name.'/'.$filename;

        if (!Storage::exists($path)){
            abort(404);
        }

        return Storage::response($path);
    }
}

Маршрут

Route::get('media/{filename}', [\App\Http\Controllers\MediaController::class, 'show']);

Создать маршрут:

Route::get('image/{filename}', 'HomeController@displayImage')->name('image.displayImage');

Создать метод контроллера:

public function displayImage($filename)

{

  

    $path = storage_public('images/' . $filename);

   

    if (!File::exists($path)) {

        abort(404);

    }

  

    $file = File::get($path);

    $type = File::mimeType($path);

  

    $response = Response::make($file, 200);

    $response->header("Content-Type", $type);

 

    return $response;

}

<img src = "{{ route('image.displayImage',$article->image_name) }}" alt = "" title = "">

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