La lecture de l'image à partir de la requête HTTP du corps en Aller
Je suis en train de jouer avec Go (première fois) et je veux construire un outil pour récupérer des images depuis Internet et de les couper (redimensionner) mais je suis bloqué sur la première étape.
package main
import (
"fmt"
"http"
)
var client = http.Client{}
func cutterHandler(res http.ResponseWriter, req *http.Request) {
reqImg, err := client.Get("http://www.google.com/intl/en_com/images/srpr/logo3w.png")
if err != nil {
fmt.Fprintf(res, "Error %d", err)
return
}
buffer := make([]byte, reqImg.ContentLength)
reqImg.Body.Read(buffer)
res.Header().Set("Content-Length", fmt.Sprint(reqImg.ContentLength)) /* value: 7007 */
res.Header().Set("Content-Type", reqImg.Header.Get("Content-Type")) /* value: image/png */
res.Write(buffer)
}
func main() {
http.HandleFunc("/cut", cutterHandler)
http.ListenAndServe(":8080", nil) /* TODO Configurable */
}
Je suis en mesure de demander une image (utilisons le logo Google) et de son type et de la taille.
En effet, je suis tout simplement ré-écriture de l'image (regardez cela comme un jouet "proxy"), réglage de Longueur et de Type de Contenu et l'écriture de l'octet de la tranche arrière, mais je me trompe quelque part. Voir à quoi il ressemble à l'image finale rendue sur Chrome 12.0.742.112 (90304):
Aussi j'ai vérifié le fichier téléchargé et c'est un 7007 octets image PNG. Il devrait fonctionner correctement si l'on regarde la demande:
OBTENIR un couper /HTTP/1.1
User-Agent: curl/7.22.0 (i486-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.0 e zlib/1.2.3.4 libidn/1.23 libssh2/1.2.8 librtmp/2.3
Host: 127.0.0.1:8080
Accepter: /HTTP/1.1 200 OK
Content-Length: 7007
Content-Type: image/png
Date: tue, 27 Dec 2011 19:51:53 GMT[PNG données]
Ce que vous pensez que je fais mal ici?
Disclaimer: je suis de rayer mon propre démangeaisons, donc probablement que je suis en utilisant le mauvais outil 🙂 de toute façon, je peux la mettre en œuvre sur Ruby, mais avant je voudrais faire Passer un essai.
Mise à jour: toujours se gratter les démangeaisons, mais... je pense que ça va être du bon côté de côté projet, donc je suis à l'ouverture, il https://github.com/imdario/go-lazor Si il n'est pas utile, au moins quelqu'un peut trouver une utilité avec les références utilisées pour la développer. Ils étaient pour moi.
Vous devez vous connecter pour publier un commentaire.
J'ai essayé votre code et a remarqué que l'image de servir a la bonne taille, mais le contenu du fichier delà d'un certain point étaient tous 0x00.
Examen de la io.Lecteur de documentation. La chose importante à retenir est que de Lire les lectures jusqu'à le nombre d'octets que vous demandez. Il peut lire de moins en moins avec aucune erreur retournée. (Vous devriez vérifier l'erreur de trop, mais ce n'est pas un problème ici.)
Si vous voulez vous assurer que votre tampon est pleine, l'utilisation io.ReadFull. Dans ce cas, il est plus simple de juste copier l'intégralité du contenu du Lecteur avec io.Copie.
Il est également important de se rappeler de fermer la requête HTTP organes.
Je voudrais réécrire le code de cette façon:
Je pense que vous êtes allé trop vite pour le servir que des choses.
Se concentrer sur la première étape, le téléchargement de l'image.
Vous avez ici un petit programme qui télécharge cette image dans la mémoire.
Il fonctionne sur mon 2011-12-22 version hebdomadaire, pour r60.3 vous avez juste besoin de gofix les importations.
Voilá!
Cette obtiendrez de l'image de la mémoire à l'intérieur de
data
.Une fois que vous avez cela, vous pouvez décoder, de la recadrer et de servir au navigateur.
Espère que cette aide.