Prometheus
Prometheus

Reputation: 33625

AttributeError: read in Python

I'm trying to get an image then turn it into an object Python understands then upload.

This is what I have tried:

# Read the image using .count to get binary
image_binary = requests.get(
    "http://danealva143.files.wordpress.com/2014/03/2012-08-girls-920-26.jpg").content


string_buffer = io.BytesIO()
string_buffer.write(image_binary)
string_buffer.seek(0)

files = {}
files['image'] = Image.open(string_buffer)
payload = {}

results = requests.patch(url="http://127.0.0.1:8000/api/profile/94/", data=payload, files=files)

I get this error:

  File "/Users/user/Documents/workspace/test/django-env/lib/python2.7/site-packages/PIL/Image.py", line 605, in __getattr__
    raise AttributeError(name)
AttributeError: read

Why?

Upvotes: 3

Views: 11716

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1122122

You cannot post a PIL.Image object; requests expects a file object.

If you are not altering the image, there is no point in loading the data into an Image object either. Just send the image_binary data instead:

files = {'image': image_binary}
results = requests.patch(url="http://127.0.0.1:8000/api/profile/94/", data=payload, files=files)

You may want to include the mime-type for the image binary:

image_resp = requests.get(
    "http://danealva143.files.wordpress.com/2014/03/2012-08-girls-920-26.jpg")
files = {
    'image': (image_resp.url.rpartition('/')[-1], image_resp.content, image_resp.headers['Content-Type'])
}

If you actually wanted to manipulate the image, you'll first have to save the image back to a file object:

img = Image.open(string_buffer)
# do stuff with `img`

output = io.BytesIO()
img.save(output, format='JPEG')  # or another format
output.seek(0)

files = {
    'image': ('somefilename.jpg', output, 'image/jpeg'),
}

The Image.save() method takes an arbitrary file object to write to, but because there is no filename in that case to take the format from, you'll have to manually specify the image format to write. Pick from the supported image formats.

Upvotes: 3

Related Questions