Carga de imágenes o archivos en Laravel

- Andrés Cruz

In english
Carga de imágenes o archivos en Laravel

Este material forma parte de mi curso y libro completo; puedes adquirirlos desde el apartado de libros y/o cursos Curso y libro Laravel 11 con Tailwind Vue 3, introducción a Jetstream Livewire e Inerta desde cero - 2024.

Vamos a aprender a cargar imágenes en Laravel; para eso, vamos a suponer que ya tienes listo algún formulario en Laravel.

En este caso, vamos a trabajar con carga de imágenes a un post, que tiene la siguiente estructura, su modelo:

class Post extends Model
{
    protected $fillable = ['title', 'slug', 'content', 'category_id', 'description', 'posted', 'image'];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

La vista de formulario luce como la siguiente:

Lo importante de notar aquí, es el campo de tipo multipart form data para habilitar la carga de archivos, y el campo de tipo file.

Para procesar el formulario, tenemos lo siguiente:


<form action="{{ route('post.update',$post->id) }}" method="post" enctype="multipart/form-data">
        @method("PATCH")
 @csrf

<label for="">Título</label>
<input type="text" class="form-control" name="title" value="{{ old('title', $post->title) }}">

<label for="">Slug</label>
<input type="text" class="form-control" name="slug" value="{{ old('slug', $post->slug) }}">

<label for="">Categoría</label>
<select class="form-control" name="category_id">
    <option value=""></option>
    @foreach ($categories as $title => $id)
        <option {{ old('category_id', "$post->category_id") == $id ? 'selected' : '' }} value="{{ $id }}">
            {{ $title }}</option>
    @endforeach
</select>

<label for="">Posteado</label>
<select class="form-control" name="posted">
    <option {{ old('posted', $post->posted) == 'not' ? 'selected' : '' }} value="not">No</option>
    <option {{ old('posted', $post->posted) == 'yes' ? 'selected' : '' }} value="yes">Si</option>
</select>

<label for="">Contenido</label>
<textarea class="form-control" name="content"> {{ old('content', $post->content) }}</textarea>

<label for="">Descripción</label>
<textarea class="form-control" name="description">{{ old('description', $post->description) }}</textarea>


<label for="">Imagen</label>
<input type="file" name="image">

<button type="submit" class="btn btn-success mt-3">Enviar</button>
       
</form>

Y la función para procesar el formulario:

public function update(PutRequest $request, Post $post)
    {
       // Resto de la funcion de carga 
        $data = $request->validated();
        if( isset($data["image"])){
            $data["image"] = $filename = time().".".$data["image"]->extension();
            $request->image->move(public_path("image/otro"), $filename);
        }
        $post->update($data);
}

Es muy sencillo; recuerda que la carga de archivos en Laravel está basado en disco, un disco es cualquier cosa que pueda almacenar archivos, como en este caso sería una carpeta local al proyecto, pero, puede ser otro servicio como Amazon Web Server; esto, lo puedes constatar en el archivo de config/filesystem.php.

Por lo demás, ya que, la imagen, lo tenemos como una carga opcional, preguntamos si está definido; generamos el nombre de la imagen con la función de time() y lo guardamos en un "disco", que es nuestra carpeta local.

Y listo, ya con esto, podemos cargar nuestros archivos en Laravel.

Recuerda que este post forma pate de mi curso y libro sobre Laravel.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.