Laravel y la maldición de las imágenes que no se ven en producción (y cómo lo solucioné)
-
- Admin User
- June 18, 2025
Migrar un proyecto Laravel desde local a producción no siempre es directo, sobre todo cuando hablamos de subir imágenes. En mi caso, todo funcionaba perfecto en desarrollo, pero al subir mi blog a Hostinger, al crear una nueva publicación... ❌ la imagen destacada no aparecía por ningún lado.
Aquí te explico el problema y cómo lo solucioné de forma limpia y definitiva.
🔍 El problema
Laravel guarda por defecto las imágenes subidas en: storage/app/public
Y espera que accedas a ellas públicamente a través de: /public/storage
Esto requiere un enlace simbólico que normalmente se crea con:
php artisan storage:link
💥 Pero en muchos hostings compartidos como Hostinger, no puedes usar enlaces simbólicos. Resultado: aunque la imagen se sube, el navegador no puede acceder a ella.
✅ La solución
En lugar de usar Storage::put() o $request->file(...)->store(...), decidí mover las imágenes directamente a una carpeta accesible públicamente:
public/storage/posts
Así modifiqué mis métodos store() y update():
if ($request->hasFile('featured_image')) {
$filename = time() . '.' . $request->file('featured_image')->extension();
$request->file('featured_image')->move(public_path('storage/posts'), $filename);
$post->featured_image = 'posts/' . $filename;
}
⚠️ Nota: ahora en la base de datos solo se guarda la ruta relativa posts/mi-imagen.jpg.
🖼️ Cómo mostrar las imágenes
En mis vistas (view.blade.php, index.blade.php, etc.) actualicé las rutas para usar asset() de forma consistente:
<img src="{{ asset('storage/' . $post->featured_image) }}" alt="{{ $post->title }}">
Así se genera correctamente la URL:
https://elpatronsingleton.com/storage/posts/mi-imagen.jpg
🔁 Unificación con el entorno de desarrollo
En local, estaba usando store('posts', 'public'), lo que sí funcionaba gracias a los symlinks. Pero para mantener consistencia entre local y producción, unifiqué ambos entornos con la misma lógica de move(...).
📁 Así desarrollo y producción se comportan igual y todo es más predecible.
🧼 Resultado
- ✅ Imágenes visibles en todas las vistas
- ✅ Producción y desarrollo sincronizados
- ✅ Sin necesidad de enlaces simbólicos
- ✅ Código más claro y mantenible
¿Has tenido el mismo problema subiendo proyectos Laravel?
¿O tu hosting tampoco soportastorage:link?
📝 ¡Cuéntamelo en los comentarios o comparte esta guía con alguien que esté peleando con Laravel en producción!
Latest Posts
-
1
-
2
-
3
-
4Aug 08, 2025
Categories
- Economía 3 Posts
- Formación 4 Posts
- Opinión 5 Posts
- Programación 11 Posts
- Proyectos 2 Posts
- Tecnología 2 Posts