Imágenes

1. Configurar sistema de archivos del proyecto

  • Crear carpeta donde se almacenarán las imágenes, para este caso public/img.

Ignorar imágenes y archivos que se creen en esa carpeta, para evitar que al momento de sincronizar con el repositorio en GitHub se suban dichos archivos. Así, se debe crear un archivo public/img/.gitignore; este ignora todo excepto el archivo en sí

*
!.gitignore
  • Editar archivo config/filesystems.php

Dentro de disks crear un nuevo sistema de archivos que almacene, en una carpeta especificada por nosotros, las imágenes

'images' => [
  'driver' => 'local',
  'root' => public_path('img'),
  'visibility' => 'public',
],

Establecer sistema de archivos por defecto, para esto se debe configurar el atributo default. Esto se puede hacer de dos maneras:

Utilizar el archivo de environment .env, configurando la variable FILESYSTEM_DRIVER:

config/filesystems.php

'default' => env('FILESYSTEM_DRIVER', 'local'),

.env

FILESYSTEM_DRIVER=images

Nota: los cambios realizados al .env deben agregarse al archivo .env.example

o directamente dentro del archivo config/filesystems.php

'default' => 'images',

2. Guardar archivos

  • Editar SellerProductController

Almacenar imagen usando método store del administrado de archivos de laravel, en el método store del controlador añadir

$data['image'] = $request->image->store('');

El método store recibe dos parámetros:

  1. _Ubicación donde se guardará la imagen: _relativo respecto al root fijado en el sistema de archivos. En este caso se guardará dentro de img directamente.

  2. _Sistema de archivos a utilizar: _al tener por defecto images no es necesario especificarlo.

Además store genera un nombre aleatorio y único para la imagen.

3. Eliminar archivos

  • Editar SellerProductController

Para eliminar imagen asociada a un producto cuando este es eliminado, importar el facade Storage

use Illuminate\Support\Facades\Storage;

y dentro del método destroy, eliminar la imagen y luego el producto

Storage::delete($product->image);

$product->delete();

4. Actualizar archivos

  • Editar SellerProductController

Para actualizar la imagen, es complejo determinar si la imagen subida es igual a la que se tenía previamente, por tanto la actualización consiste en eliminar la antigua imagen y almacenar la enviada por el usuario.

En el método update del controlador, antes de verificar que hubo cambios y guardarlos

if($product->isClean())
{
    return $this->errorResponse('At least one new value of a field is needed to update', 422);
}

$product->save();

Añadir

if($request->hasFile('image'))
{
    Storage::delete($product->image);

    $product->image = $request->image->store('');
}

*Usar hasFile para determinar si la petición contiene algún archivo en el input llamado image

5. Probar con Postman

En el caso de actualizar un archivo, postman no permite enviar archivos usando x-www-form-urlencoded, por tanto se debe hacer una petición post y añadir al body un campo llamado .method con valor put

  • Crear producto

  • Actualizar producto

*Importante verificar que no tenga la cabecera Content-Type = application/x-www-form-urlencoded

Last updated

Was this helpful?