Input File con Validación y Subida de Archivos en Laravel
Subir archivos es una funcionalidad clave en aplicaciones web, pero su implementación requiere seguridad y precisión. En este tutorial, te enseñaremos cómo usar un input file en Laravel con validación tanto del lado del cliente como del servidor, y cómo almacenar archivos de manera eficiente.
1. Crear el Formulario con Blade
Para subir archivos, necesitas un formulario con enctype="multipart/form-data":
blade
<form action="{{ route('upload.file') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="form-group">
<label for="documento">Adjuntar archivo (PDF o Imagen):</label>
<input
type="file"
name="documento"
id="documento"
class="form-control @error('documento') is-invalid @enderror"
accept=".pdf,.jpg,.png" <!-- Filtra formatos en el cliente -->
>
@error('documento')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">Subir</button>
</form>
2. Validación en Laravel
La validación del lado del servidor es obligatoria para seguridad. En el controlador:
php
public function store(Request $request)
{
$request->validate([
'documento' => 'required|file|mimes:pdf,jpg,png|max:2048', // Máximo 2MB
]);
// Almacenar el archivo
$path = $request->file('documento')->store('uploads', 'public');
return redirect()->back()->with('success', '¡Archivo subido con éxito!');
}
Reglas de validación clave:
file: Verifica que el input sea un archivo.mimes: Define formatos permitidos (ej:pdf,jpg).max: Tamaño máximo en kilobytes (ej:2048= 2MB).
3. Almacenar Archivos de Forma Segura
Laravel simplifica el almacenamiento con el método store():
php
// Almacenar en el disco "public" (config/filesystems.php)
$path = $request->file('documento')->store('uploads', 'public');
// Personalizar el nombre del archivo
$nombreArchivo = time() . '_' . $request->file('documento')->getClientOriginalName();
$path = $request->file('documento')->storeAs('uploads', $nombreArchivo, 'public');
Crear un enlace simbólico para acceso público:
bash
php artisan storage:link
4. Mostrar el Archivo Subido
Para mostrar el archivo en una vista:
blade
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<!-- Enlace al archivo -->
<a href="{{ asset('storage/' . $path) }}" target="_blank">
Ver archivo subido
</a>
5. Mejoras y Buenas Prácticas
-
Validación en el cliente:
Usa el atributoaccepten el input para filtrar formatos antes de subir.html
<input type="file" accept=".pdf,image/*">
-
Nombres únicos:
Evita sobrescribir archivos usandotime()oStr::uuid(). -
Eliminar archivos temporales:
Programa una tarea para limpiar archivos no usados:php
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('files:clean')->daily();
}
-
Seguridad avanzada:
Valida dimensiones de imágenes:php
Copiar
1
'documento' => 'dimensions:min_width=800,min_height=600'
6. Errores Comunes y Soluciones
-
Error: "The uploaded file exceeds the maximum allowed size."
Solución: Ajustamaxen la validación y verificaupload_max_filesizeenphp.ini. -
Error: "File not found."
Solución: Verifica que el enlace simbólico (storage:link) esté creado.
Conclusión
Implementar un input file con validación en Laravel es sencillo si sigues estos pasos. Prioriza la seguridad validando siempre en el servidor, usa nombres únicos para evitar conflictos y programa limpiezas periódicas de archivos temporales. Con esta guía, estarás listo para gestionar subidas de archivos como un profesional.
Tutoriales Recomendados
Sigue explorando publicaciones de la misma categoría
Agregar Inputs de Tipo Checkbox en Laravel 12 con Validación y Bootstrap | Part 04
Agregar Inputs de Tipo Radio en Laravel 12 con Validación y Bootstrap | Part 05
Validación de Textarea en Laravel: Cómo Evitar Código Malicioso