# 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í

```php
*
!.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

```php
'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**

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

**.env**

```php
FILESYSTEM_DRIVER=images
```

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

o directamente dentro del archivo **config/filesystems.php**

```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.&#x20;

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**

```php
use Illuminate\Support\Facades\Storage;
```

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

```php
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

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

$product->save();
```

Añadir

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

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

**\***&#x55;sar 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

![](https://2267475011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld9lcX9orZDYVZ13PCn%2F-Ld9ldebgf49DagvPpiL%2F-Ld9leH0z0OwqSc486vM%2FSchermata%202017-09-03%20alle%2011.45.23%20AM.png?generation=1556032694707964\&alt=media)![](https://2267475011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld9lcX9orZDYVZ13PCn%2F-Ld9ldebgf49DagvPpiL%2F-Ld9leH2b7Rxv5zJkT5k%2FSchermata%202017-09-03%20alle%2011.45.23%20AM.png?generation=1556032694710231\&alt=media)

* Actualizar producto

![](https://2267475011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld9lcX9orZDYVZ13PCn%2F-Ld9ldebgf49DagvPpiL%2F-Ld9leH4_vCttzqhazl7%2FSchermata%202017-09-03%20alle%2011.51.26%20AM.png?generation=1556032694646624\&alt=media)

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