2016-12-30 7 views
2

私は、スクラップしているページのイメージをダウンロードし、それをDjangoモデルの "screenshot" ImageFieldとして保存するWebスクレーパーを持っています。私はこのコードを使用しています:BytesIOをDjango ImageFieldに保存する

def save_screenshot(source,screenshot): 
    box = (0, 0, 1200, 600) 
    im = Image.open(io.BytesIO(screenshot)) 
    region = im.crop(box) 
    tempfile_io = io.BytesIO() 
    region.save(tempfile_io, 'JPEG', optimize=True, quality=70) 
    source.screenshot.save(source.slug_name+"-screenshot",ContentFile(tempfile_io.getvalue()),save=True) 

それは/メディア/ news_source_screenshots /ディレクトリにスクリーンショットが保存されますが、モデルに保存されません。モデルフィールドは、次のように定義されます。

screenshot = models.ImageField(upload_to='news_source_screenshots',blank=True,null=True) 

何が欠けていますか?

+0

データなしで一時ファイルを保存していることがわかりました。ソースファイル "source.screenshot.save(source.slug_name +" - screenshot "、ContentFile(region.get_value())に' region'を保存する必要があります。 、save = True) '、あなたの一時ファイルの領域を覚えています。tempfile_ioはvoidバッファーです –

+0

ありがとうございます。@ german-alzate-martinezありがとうございました。バッファーインターフェイス 'code'に保存され、画像は/ media/news_source_screenshost /ディレクトリに保存されません –

+0

バッファを文字列ioに変更してみてください。 –

答えて

0

だから、上記のコードは素晴らしいですね!

source = NewsSource.objects.get(name=name) 
html,screenshot = get_url(source.url) 
save_screenshot(source,screenshot) 
source.save() 

だからsave_sceenshot方法が働いていたが、その後、それはやった仕事は私のsource.save()の呼び出しによって上書きされた:問題は、私はこのようなコードの一部を使用して上記の方法を呼んでいたということでした。 Go figure!

関連する問題