将图像从URL上传到easy_thumbnails字段

时间:2013-07-22 16:04:18

标签: django image urllib2 django-models

我想在使用脚本创建对象时从URL上传许多图像。

#models.py
class Widget(TimeStampedModel):    
        name = CharField ... etc, etc
        pic = ThumbnailerImageField(_('Widget Pic'), 
        upload_to='widget/pic/', 
        help_text = _('Please submit your picture here.'),
        null=True, blank=True) 

所以我想到使用该类中的save方法来下载和保存图像。所以我的脚本创建Widget对象并保存图像url,然后save方法尝试下载并保存图像。到目前为止我的保存方法是:

def save(self, *args, **kwargs):        
    if self.pic:
        if self.pic.name.startswith( 'http://') and self.pic.name.endswith(('.png', '.gif', '.jpg', '.jpeg', '.svg')):
            my_temp_pic = open('test.image', 'w')
            my_temp_pic.write(urllib2.urlopen(self.pic.name).read())
            my_temp_pic.close()

            my_temp_pic = open('test.image')

            thumbnailer = get_thumbnailer(my_temp_pic, relative_name = self.slug+'.'+self.pic.name.split('.')[-1])
            self.pic = thumbnailer.get_thumbnail({'size': (200, 0), 'crop': False})
    super(Widget, self).save(*args, **kwargs)               

我试图用.read()或.open()以不同的方式打开文件......但我找到的唯一方法(上面)感觉相当hackish(保存一些带有图像的临时文件,重新打开,然后保存)。有没有更好的办法?我错过了直截了当的方法吗?

1 个答案:

答案 0 :(得分:1)

保存临时文件是我所知道的唯一解决方案。检查一下:http://djangosnippets.org/snippets/1890/

所以基本上你不需要像close()open()那样再做一些hackish。你可以这样做:

from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

# ... your code here ...

my_temp_pic = NamedTemporaryFile(delete=True)
my_temp_pic.write(urllib2.urlopen(self.pic.name).read())
my_temp_pic.flush()

relative_name = '%s.%s' % (self.slug, self.pic.name.split('.')[-1])
thumbnailer = get_thumbnailer(my_temp_pic, relative_name=relative_name)

# ... your code again ...

希望它有所帮助。