Subir varias imagenes en Laravel 11.x

Publicado por Robert_cdp
hace 3 semanas

Hola estoy realizando la subida de multiples imagenes, sin embargo asi es como lo tengo actualmente.

$product = Product::create([
                'category_id' => $request->input('category_id'),
                'name' => $request->input('product_name'),
                'slug' => Str::slug($request->input('product_name')),
                'description' => $request->input('product_description'),
                'status' => $request->input('status'),
                'retail_price' => $request->input('retail_price'),
                'discount_price' => $request->input('discount_price'),
                'wholesale_price' => $request->input('wholesale_price'),
                'min_stock' => $request->input('min_stock'),
            ]);

            if ($request->hasFile) {
                $files = $request->file('images');

                foreach ($files as $file) {

                    $filename = $file->getClientOriginalname();
                    $filepath = $file->storeAs('images/products', $filename, 'public');

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

            return redirect()->back()->with('success', 'Guardado correctamente.');

alguna forma de mejorarlo?

Laravel 11.x
Respuesta de Cristian Olaz
hace 3 semanas

Hola Roberto,

A mi me parece bien en general. Pero te dejo 3 pequeñas correcciones que podrías hacer:

1: Hacer la validación tanto del producto como de los archivos

2: El hasFile no tiene parámetros:

if ($request->hasFile("images")) {

3: Al guardar la imagen, el problema que veo es que si el usuario sube 2 archivos con el mismo nombre entonces el segundo va a sobreescribir al primero. Quizá el $filename podría ser un string random (\Str::random()) o un hash. En ese caso tendrías que guardar ese filename en la tabla ProductImage

Por último, esto es más una cuestión de preferencia, yo en general prefiero tener 2 métodos separados: uno para subir los archivos y otro para guardar la información del producto. El primero retornaría el ID del archivo que luego podés incluir en el segundo. De ese modo me parece un poco más fácil hacer las validaciones.

Espero que te sirva

Saludos!,

Respuesta de Robert_cdp
hace 3 semanas

Gracias por las recomendaciones, actualmente uso un request para el guardado de productos asi que de esa parte la validacion va bien, tienes mucha razon en el punto 2, se me habia olvidado agregar el paramtro para validar.

me podrias dar mas ejemplo de la parte tres?

Respuesta de Cristian Olaz
hace 2 semanas

Hola Roberto,

Te dejo un ejemplo de cómo podrías hacer lo que te comentaba en el punto 3:

use Illuminate\Support\Str;

// ...

if ($request->hasFile) {
    $files = $request->file('images');

    foreach ($files as $file) {

        $filename = Str::uuid() . '.' . $file->getClientOriginalExtension();

        // Otra alternativa:
        // $filename = uniqid() . '_' . time() . '.' . $file->getClientOriginalExtension();

        $filepath = $file->storeAs('images/products', $filename, 'public');

        ProductImage::create([
            'product_id'    => $product->id,
            'file_path'     => $filepath,
            'file_name'     => $filename,
            'original_name' => $file->getClientOriginalname()
        ]);
    }
}

Espero que te sirva

Saludos!,

Respuesta de Robert_cdp
hace 2 semanas

Gracias por la recomendacion, me ayuda bastante