BytesIO to POST file with requests
I have been working on a project that prohibits me from saving files to disk. In my case, I needed to download an image from a website and upload that image elsewhere.
GET the file as a Byte Stream
This can be done using only requests and BytesIO; no need for Pillow or any other file manipulation modules! After getting the file through a GET request (r = requests.get(url)
), read the response as bytes using r.content
. These bytes can be used to create a BytesIO object file = BytesIO(r.content)
.
POST the file for upload
Now that you have a BytesIO object, requests can send that object as a file parameter. Use the getvalue()
method to read the entire buffer of the BytesIO object. Create the files parameter for the requests encoded-file upload: files = { 'file':file.getvalue() }
. Now that the parameters are ready, the file is ready for upload r = requests.post(url, files=files)
.
Putting it all together:
There you have it, upload a file without ever saving it to disk.