1

スクリプトでオブジェクトを作成しながら、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() を使用してさまざまな方法でファイルを開こうとしました...しかし、私が見つけた唯一の方法(上記)は非常にハックな気がします(画像で一時ファイルを保存し、再度開き、次に保存)。より良い方法はありますか?これを行う簡単な方法がありませんか?

4

1 に答える 1

1

一時ファイルを保存することも、私が知っている唯一の解決策です。これを確認してください: http://djangosnippets.org/snippets/1890/

close()したがって、基本的にハックを何度も行う必要はありませんopen()。できるよ:

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 ...

それが役に立てば幸い。

于 2013-07-22T20:09:17.483 に答える