Reputation: 6702
I need to save image from url, with Django. So I did like the tutorial says, but I get a strange error.
page = requests.get(url)
if page.status_code != 200 or not page.content:
assert 0, 'can\'t download article image'
image = image_content_file(page.content)
article.image.save('%i.jpg' % article.pk, image, save=False)
My Article Model :
class Article(models.Model):
title = models.CharField(max_length=255)
content = models.TextField(blank=True)
image = models.ImageField(blank=True, upload_to='upload/article_image')
date_created = models.DateTimeField(null=True, blank=True, db_index=True)
I have created upload/article_image
folder and set its rights to 777
My image_content_file
function :
def image_content_file(img_content):
input_file = StringIO(img_content)
output_file = StringIO()
img = Image.open(input_file)
if img.mode != "RGB":
img = img.convert("RGB")
img.save(output_file, "JPEG")
return ContentFile(output_file.getvalue())
But I get this error
image = image_content_file(page.content)
File "/home/yital9/webservers/binarybits/binarybits/../binarybits/utils/img.py", line 24, in image_content_file
img.save(output_file, "JPEG")
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 1439, in save
save_handler(self, fp, filename)
File "/usr/local/lib/python2.7/dist-packages/PIL/JpegImagePlugin.py", line 471, in _save
ImageFile._save(im, fp, [("jpeg", (0,0)+im.size, 0, rawmode)])
File "/usr/local/lib/python2.7/dist-packages/PIL/ImageFile.py", line 481, in _save
e = Image._getencoder(im.mode, e, a, im.encoderconfig)
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 399, in _getencoder
return apply(encoder, (mode,) + args + extra)
TypeError: function takes at most 9 arguments (11 given)
Can you give me any advice what is the problem?
Upvotes: 2
Views: 776
Reputation: 1835
To make it work in Python 3, you have to use
urllib.request.urlretrieve(url=filepath)
Upvotes: 0
Reputation: 31494
This code should do what you need:
import urllib2
from django.core.files.base import ContentFile
content = ContentFile(urllib2.urlopen(url).read())
article.image.save('%i.jpg' % article.pk, content, save=True)
Instead if you just want to download an image from the web is better to do this:
from urllib import urlretrieve
urlretrieve(url, '%i.jpg' % article.pk)
Upvotes: 2