Laravel y la maldición de las imágenes que no se ven en producción (y cómo lo solucioné)
Programación Formación

Laravel y la maldición de las imágenes que no se ven en producción (y cómo lo solucioné)

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 soporta storage:link?

📝 ¡Cuéntamelo en los comentarios o comparte esta guía con alguien que esté peleando con Laravel en producción!
Hi, I'm Admin User

Soy Diego, el culpable de todo esto. Mezclo código con café y teorías económicas con bugs existenciales. Bienvenido al blog donde solo hay una instancia, pero muchas ideas.

Categories
ads

Descubre artículos únicos sobre desarrollo, tecnología, economía y más

Explora contenidos creados con pasión para ayudarte a crecer como desarrollador y emprendedor. ¡Gracias por formar parte de este proyecto!