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.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.