使用Boto将枕头文件保存到S3 [英] Saving a Pillow file to S3 with boto

查看:62
本文介绍了使用Boto将枕头文件保存到S3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过s3boto将Amazon S3用作存储后端.我有一个带有ImageField的Image模型.通过管理员上传图像后,该图像将成功上传到S3.我现在想要做的是使用Pillow创建缩略图后保存.我已经通过在其上调用show()方法验证了缩略图已创建,但是由于某种原因它没有被上传到S3.我认为我的保存方式可能​​是错误的-任何建议都将不胜感激.

I use Amazon S3 as my storage backend via s3boto. I have an Image model with an ImageField. When an image is uploaded via the admin, it is successfully uploaded to S3. What I am now trying to do is to create a thumbnail post-save using Pillow. I have verified that the thumbnail is being created by calling the show() method on it, but for some reason it is not being uploaded to S3. I think the way I am saving it may be wrong - any suggestions would be appreciated please.

tasks.py

from celery import shared_task
from .models import Image
import os
from django.core.files.storage import default_storage as storage
from PIL import Image as PillowImage

@shared_task
def create_thumbnails(pk):
    try:
        image = Image.objects.get(pk=pk)
    except Image.ObjectDoesNotExist:
        pass
    thumbnail_size = (450,200)
    filename, ext = os.path.splitext(image.image.name)
    try:
        fh = storage.open(image.image.name, 'r')
        im = PillowImage.open(fh)
        im.thumbnail(thumbnail_size)
        im.show() # TEST - This opens the resized image in Preview on my mac
        filename = filename +'_thumbnail' +ext
        new_file = storage.open(filename, 'w')
        im.save(new_file, "PNG")
        new_file.close()
    except IOError as error:
        print("cannot create thumbnail for ", filename, 'error ', error)

堆栈

Django 1.85

django 1.85

python 2.7.10

python 2.7.10

推荐答案

在经过数小时的痛苦的谷歌搜索后,终于可以正常工作了,这主要归功于

Finally got it working after a very painful few hours of googling, mostly thanks to this blog post.

tasks.py

from celery import shared_task
import os
from django.core.files.storage import default_storage as storage
from django.conf import settings
import mimetypes
import cStringIO
from PIL import Image as PillowImage
import boto
from .models import Image

@shared_task
def create_thumbnails(pk):
    try:
        image = Image.objects.get(pk=pk)
    except Image.ObjectDoesNotExist:
        pass
    try:
        thumbnail_size = (450,200)
        filename, ext = os.path.splitext(image.image.name)
        filename = filename +'_thumbnail' +ext
        existing_file = storage.open(image.image.name, 'r')
        im = PillowImage.open(existing_file)
        im = im.resize(thumbnail_size, PillowImage.ANTIALIAS)
        memory_file = cStringIO.StringIO()
        mime = mimetypes.guess_type(filename)[0]
        plain_ext = mime.split('/')[1]
        im.save(memory_file, plain_ext)

        conn  = boto.connect_s3(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
        bucket = conn.get_bucket( 'yourbucketname', validate=False)
        k = bucket.new_key('media/' +filename)
        k.set_metadata('Content-Type', mime)
        k.set_contents_from_string(memory_file.getvalue())
        k.set_acl("public-read")
        memory_file.close()
    except Exception as error:
        print("cannot create thumbnail for ", filename, 'error ', error)

这篇关于使用Boto将枕头文件保存到S3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆