Возврат пути к изображению в ресурсе Laravel API

Я создаю приложение только для API laravel 5.8 и хочу вернуть путь к изображению как путь к ресурсу API, чтобы его можно было использовать внутри атрибута источника изображения. Вот что я должен сделать, чтобы достичь этого. 1. Я запустил команду php artisan storgae:link, чтобы создать символическую ссылку с public/storage на storage/app/public.

  1. Сначала я сохраняю изображение в таблице productImages, когда новый продукт успешно создается следующим образом.
public function store(Request $request)
{
    // create & store the product
    if ($product = Product::create([
        'name'      => $request->name,
        'category'  => $request->category,
        'status'    => $request->status,
        'price'     => $request->price,
        'interest'  => $request->interest,
    ])) {
        // store the product image
        $file = $request->file('image');
        $destinationPath = "public/images/products";
        $filename = 'pramopro_' . $product->name . '_' . $product->id . '.' . $file->extension();

        Storage::putFileAs($destinationPath, $file, $filename);

        ProductImage::create([
            'product_id'    => $product->id,
            'name'          => $filename
        ]);
    }

    // return new product
    return new ProductResource($product);
}
  1. Верните путь к изображению в ProductResource следующим образом.
public function toArray($request)
{
    return [
        'id'        => $this->id,
        'name'      => $this->name,
        'category'  => $this->category,
        'status'    => $this->status,
        'price'     => $this->price,
        'interest'  => $this->interest,
        'hidden'    => $this->hidden,
        'imageUrl'  => asset('images/products/' . $this->image->name)
    ];
}

Тестируя его на моей локальной подаче, я получаю такой путь

{
    "id": 1,
    "name": "dpk",
    "category": "fuel",
    "status": "open",
    "price": 100000,
    "interest": 0.2,
    "hidden": 0,
    "imageUrl": "http://localhost:8000/images/products/pramopro_dpk_1.jpeg"
  }

Когда я пытаюсь просмотреть изображение, набрав http://localhost:8000/images/products/randomtext_1.jpeg в своем браузере, я получаю ошибку 404 not found.

Но это http://localhost:8000/storage/images/products/pramopro_dpk_1.jpeg отображает изображение, как и ожидалось.

Как мне получить путь к изображению, чтобы он работал?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
2 896
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

функция assets() помещает вас в ваш общедоступный каталог, вам нужно добавить /storage к пути к вашему файлу, попробуйте это в своей функции toArray

'imageUrl'  => asset('storage/images/products/' . $this->image->name)

Личное примечание: обработка мультимедиа в laravel может быть головной болью, я лично использую LaravelMediaLibrary от spaite.

https://github.com/spatie/laravel-medialibrary

это действительно помогло мне и сделало работу с носителями настолько простой, насколько это возможно, особенно при работе с несколькими носителями для одной и той же модели.

Я проверю LaravelMediaLibrary пакет. На самом деле мне пришлось добавить storage к пути.

Mena 15.07.2019 13:25

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