Receiving gzip with Flask
For Python 3, I would just use gzip.decompress(request.data)
which returns a decompressed string.
It's just a convenient shorthand function, added 8 years ago :)
If you want to take a look at the code, you can find it here.
2019 edit: wrote a simple flask extension you can use in your app.
You import StringIO
but never actually utilize it and feed a string to gzip.open
which requires a filename. The error you're getting is from gzip
trying to decode the filename to Unicode before attempting to open it.
The following utilizes StringIO to make a file-like object that can be used by gzip:
...
fakefile = StringIO.StringIO(request.data) # fakefile is now a file-like object thta can be passed to gzip.GzipFile:
uncompressed = gzip.GzipFile(fileobj=fakefile, mode='r')
return uncompressed.read()
...
Edit: I've refactored the code below and put relevant comments for a better understanding of what is going on:
from flask import Flask, request
import gzip, StringIO
app = Flask(__name__)
@app.route('/', methods = ['POST'])
def my_function():
# `request.data` is a compressed string and `gzip.GzipFile`
# doesn't work on strings. We use StringIO to make it look
# like a file with this:
fakefile = StringIO.StringIO(request.data)
# Now we can load the compressed 'file' into the
# `uncompressed` variable. While we're at it, we
# tell gzip.GzipFile to use the 'rb' mode
uncompressed = gzip.GzipFile(fileobj=fakefile, mode='rb')
# Since StringIOs aren't real files, you don't have to
# close the file. This means that it's safe to return
# its contents directly:
return uncompressed.read()
if __name__ == "__main__":
app.debug = True
app.run()
The accepted answer is correct for Python 2, but just in case you're trying this with Python 3, you need to use BytesIO instead of StringIO:
compressed_data = io.BytesIO(request.data)
text_data = gzip.GzipFile(fileobj=compressed_data, mode='r')