2 votes

Envoi au client d'une charge utile déjà compressée (Gzip)

J'ai du mal à envoyer une réponse qui est un fichier Gzip à partir de S3. Je télécharge le fichier depuis S3 sous forme de fichier Array[Byte] et je voudrais ensuite le transmettre au client pour que le navigateur s'occupe de la décompression.

Pour être clair, je n'utilise pas le gzipFilter intégré dans Play, car les données sont déjà zippées.

J'ai ceci dans l'action de mon contrôleur :

s3DAO.getFile(id).map(bytes => Ok(bytes).as("application/gzip”))

Sur le client (en utilisant Postman pour le débogage), le fichier Content-Type est réglé sur application/gzip mais le corps ressemble à ça :

���[�W�$��j3��-��/�-HOz��ƒ@�HȄ%D���E�Л��%�=P�����$�*v7��X����������=޾x|��w������챕8�,��X���

Je sais que les octets représentent une charge utile valide, car si j'insère moi-même du code pour la décompresser dans l'action du contrôleur, je peux l'imprimer correctement :

val zipInputStream = new GZIPInputStream(new ByteArrayInputStream(bytes))
val rawString = scala.io.Source.fromInputStream(zipInputStream, Charsets.UTF_8.name).mkString
println(rawString) // I can see my payload

Je ne sais pas quoi faire pour déboguer davantage.

3voto

Tyler Points 1726

J'ai posté la même question sur le site Jouer à la chaîne Gitter et j'ai découvert que la réponse était de régler le Content-Type a octet-stream et ensuite de spécifier l'encodage comme gzip :

Ok(bytes).as("application/octet-stream").withHeaders("Content-Encoding" -> "gzip")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X