Servir imagen en servidor web con Golang

Hoy vamos a ver cómo enviar una imagen al cliente desde Golang, es decir, servir una imagen en un servidor web programado con Go.

Vamos a leer la imagen según su ruta y luego enviarla con los encabezados adecuados al cliente.

Enviar imagen como respuesta HTTP en Golang

Para esto usaremos http.ServeFile, función que recibe los argumentos de http.ResponseWriter, *http.Request y la ruta completa del archivo (podemos servir cualquier tipo de archivo incluyendo imágenes).

Entonces ya no necesitamos programar nuestra función, simplemente invocar a ServeFile.

Antes de servir el archivo necesitamos establecer los encabezados adecuados, sobre todo para el Content-Type.

Para obtener el Content-Type podemos invocar a:

mime.TypeByExtension(filepath.Ext(rutaImagen))

Primero obtenemos la extensión del archivo con filepath.Ext y luego a partir de ella invocamos a mime.TypeByExtension.

Ejemplo

Yo tengo una ruta web definida en donde a partir del id de un producto leo la imagen del sistema de archivos y la envío de vuelta al cliente.

En mi caso estoy usando el toolkit de Gorilla/Mux pero funciona aunque uses el net/http de la biblioteca estándar.

enrutador.HandleFunc("/foto_producto", func(w http.ResponseWriter, r *http.Request) {
  idsProductos, existenIdsProductos := r.URL.Query()["id"]
  if !existenIdsProductos || len(idsProductos) < 0 {
    responderHttpConError(errors.New("no hay id en la URL"), w, r)
    return
  }
  idProducto := idsProductos[0]
  pc := ProductosController{
    AjustesUsuario: AjustesDeUsuarioLogueado{
      httpResponseWriter: w,
      httpRequest:        r,
    },
  }

  idProductoEntero, err := strconv.Atoi(idProducto)
  if err != nil {
    responderHttpConError(err, w, r)
    return
  }
  producto := pc.porRowid(idProductoEntero)
  if producto.Foto != "" {
    rutaImagen := filepath.Join(DirectorioArchivos, producto.Foto)
    w.Header().Set("Content-Type", mime.TypeByExtension(filepath.Ext(rutaImagen)))
    http.ServeFile(w, r, rutaImagen)
    return
  } else {
    w.WriteHeader(http.StatusNotFound)
  }

}).Name("VerProductos").Methods(http.MethodGet)

En la línea 2 a la 7 leo el id que se debe pasar por un parámetro GET en la URL.

Luego consulto el producto a partir de ese id, y si existe una foto entonces calculo la ruta completa en la línea 22 para servir la imagen en las líneas 23 y 24.

Si la foto no existe simplemente envío un código de respuesta 404.

Para terminar te dejo con más tutoriales de Go en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *