2010-12-14 78 views
1

J'écris une servlet java sur AppEngine. Cette servlet génère des images png. Je voudrais "gzip" la réponse. Je le fais de cette façon:GZipOutputStream & appengine

resp.setHeader("Content-Encoding","gzip"); 
resp.setContentType("image/png"); 

// ... png generation ... 

GZIPOutputStream gzos = new GZIPOutputStream(resp.getOutputStream()); 
gzos.write(myPNGdata); 
gzos.close(); 

Mais: dans le serveur de développement, il est ok, les .png affiche fins et la réponse est bien au format gzip. Ensuite, je test sur le serveur de production (AppEngine) et tout ce que je reçois est un "cassé" image ...

alt text

ce qui pourrait être mal avec mon code? Est-ce lié à l'environnement dev/prod? Bien sûr, si je ne gzip la sortie, c'est OK dans les deux environnements.

Merci pour toute aide.


Edit: J'ai essayé cela aussi:

GZIPOutputStream gzos = new GZIPOutputStream(resp.getOutputStream()); 
gzos.write(ImagesServiceFactory.makeImage(readImage("somePicture.png")).getImageData()); 
gzos.flush(); 
gzos.finish(); 
gzos.close(); 

et il ne fonctionne pas non plus.


Édition 2: en fait, la réponse est gzip. Je suis allé chercher le servlet avec "curl theUrl> tmp.gz", puis j'ai gunzip "tmp.gz", et l'image est très bien. Mais aucun navigateur peut l'afficher :(correctement Quel est le problème avec mon gzip?

Répondre

0

Vérifiez la taille de l'image téléchargée. Si elle est plus petite vous attend, vous avez besoin le plus susceptible de purger le flux avant la fermeture.

+0

J'ai essayé avec 'gzos.flush();' et 'gzos.finish();' mais c'est le OK sur le serveur de développement, KO sur le moteur de l'application –

+0

Avez-vous essayé resp.getOutputStream(). flush()? –

3

L'infrastructure App Engine s'occupera du contenu de gzipping pour vous le cas échéant.Vous ne devriez pas le faire vous-même

+0

http://code.google.com/appengine/docs/java/runtime.html#Responses –

+0

I sais que mais je ne peux pas changer e demande les en-têtes du côté client (application héritée). Mais comme il fonctionne dans le serveur de développement, il devrait fonctionner sur un vrai moteur d'application, n'est-ce pas? –

+0

@Francois C'est un bug si cela fonctionne dans le dev_appserver - parce que vous ne pouvez pas définir vous-même ces en-têtes en production. –