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.
En este post te quiero compartir un código de C++ para listar y cancelar trabajos…
Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…
Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…
Esta semana estuve recreando la API del plugin para impresoras térmicas en Android (HTTP a…
Hoy te enseñaré a extraer la cadena base64 de una clave PEM usando una función…
Encender un foco con un Bot de Telegram es posible usando una tarjeta como la…
Esta web usa cookies.