7
votes

Comment retourner une image dans une réponse HTTP avec Cherrypy

J'ai un code qui génère un cairo imagesursurface , et je l'expose comme: xxx

ceci ne fonctionne pas (les navigateurs signalent que l'image a des erreurs ).

J'ai testé que superfase.write_to_png ('test.png') fonctionne, mais je ne sais pas quoi jeter les données pour le renvoyer. Je suppose qu'un objet semblable à un fichier? Selon La documentation Pycairo , get_data () retourne un tampon. J'ai aussi maintenant essayé: xxx

aussi, est-il préférable de créer et de maintenir cette image en mémoire (comme j'essaye de le faire) ou d'écrire sur le disque comme un fichier temp et le servir à partir de là? J'ai seulement besoin de l'image une fois, alors il peut être jeté.


4 Réponses :


0
votes

Avez-vous essayé retour str (surface.get_data ()) ?


0 commentaires

0
votes

Essayez ceci pour l'approche 'Fichier dans la mémoire'

return StringIO.StringIO(surface.get_data())


0 commentaires

17
votes

ajoutez ces importations: xxx pré>

puis va comme ceci: p>

cherrypy.response.headers['Content-Disposition'] = 'attachment; filename="file.png"'


5 commentaires

Fonctionne très bien! Pour la Bounty, pourriez-vous m'expliquer pourquoi?


Grande réponse, Zifot - Je pense que la clé utilise "write_to_png" qui convertit les données brutes au format PNG. Il suffit d'utiliser surface.get_data () ne fonctionnera pas car il n'est pas stocké en interne en tant que données PNG (c'est ARGB_32).


@Margr Novakowski - merci. Vous avez raison, ImageURFace contient des données en mémoire dans l'un des formats décrits ici: Cairographics.org/manual/... . Le format du fichier de sortie est une histoire différente.


@Colinmarc - Afaik Si vous questionne une prime a une prime, alors l'attribuant et accepte la réponse (qui sont maintenant des actions distinctes) sont possibles à peine deux jours après avoir créé une prime.


Merci un tas, j'étais vraiment coincé pendant un moment. =)



1
votes

Vous échouez à cause de ne pas comprendre le fonctionnement de surface.get_data () . Vous essayez de renvoyer le type de mime image / png mais surface.get_data () retours image bitmap uni (N'EST PAS un fichier bitmap Windows .BMP avec en-tête) qui est une seule image de l'image de "écran virtuel" (surface)

comme ceci: xxx


0 commentaires