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.
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
.
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.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.