Django管理员上传和图像到s3然后调整图像大小并保存拇指问题

时间:2011-03-10 20:30:22

标签: django django-admin amazon-s3 python-imaging-library

错误尝试上传并使用pil和botos3以及django default_storage将图像调整为s3后出错。我试图在管理员保存时这样做。

这是代码:

from django.db import models
from django.forms import CheckboxSelectMultiple

import tempfile

from django.conf import settings

from django.core.files.base import ContentFile
from django.core.files.storage import default_storage as s3_storage
from django.core.cache import cache

from datetime import datetime

import Image, os
import PIL.Image as PIL
import re, os, sys, urlparse

class screenshot(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)

    image = models.ImageField(upload_to='screenshots')
    thumbnail = models.ImageField(upload_to='screenshots-thumbs', blank=True, null=True, editable=False)

    def save(self):
        super(screenshot, self).save() # Call the "real" save() method
        if self.image:

            thumb = Image.open(self.image.path)
            thumb.thumbnail(100, 100)

            filename = str(self.slug)

            temp_image = open(os.path.join('tmp',filename), 'w')
            thumb.save(temp_image, 'JPEG')

            from django.core.files import File
            thumb_data = open(os.path.join('/tmp',filename), 'r')
            thumb_file = File(thumb_data)

            new_file.thumb.save(str(self.slug) + '.jpg', thumb_file)


    def __str__(self):
        return self.title

这只是我试图让它工作的众多方法之一,我得到(2,'没有这样的文件或目录')或其他一些错误。

有人可以帮助我让它运转起来。我希望它使用django后端来上传的图像被调整大小并保存为缩略图然后保存。如果您需要了解任何信息,请与我们联系。我很乐意使用django代码段 - http://djangosnippets.org/snippets/224/,但我不知道要提供什么数据。我得到相同的IOErrors和'没有这样的路径/文件名',即使主图像上传到s3罚款。我也尝试过这样的事情:

myimage = open(settings.MEDIA_URL + str(self.image)) 
myimage_io = StringIO.StringIO()
imageresize = myimage.resize((100,100), Image.ANTIALIAS)
imageresize.save('resize_100_100_aa.jpg', 'JPEG', quality=75)

现在看了3天,所以我开始饶了!感谢

2 个答案:

答案 0 :(得分:7)

我有类似的问题,但在我的情况下使用sorl-thumbnail不是一个选项。我发现我可以通过传入文件描述符而不是路径直接从S3BotoStorage打开一个Image。

所以而不是

thumb = Image.open(self.image.path)

使用

thumb = Image.open(s3_storage.open(self.image.name))

然后您可以像以前一样在本地处理和保存新文件。

答案 1 :(得分:5)

为什么不试试sorl-thumbnail。它具有与默认的ImageField django提供的完全相同的界面,并且看起来它比使用自己的支持更好。

  • 存储支持
  • 可插拔引擎支持(PIL,pgmagick)
  • 可插入密钥值存储支持(redis,缓存db)
  • 可插拔后端支持
  • 可以删除的管理员集成
  • 虚拟世代
  • 灵活,简单的语法,不生成html
  • 用于删除缩略图的模型的ImageField
  • CSS样式裁剪选项
  • 垂直定位的保证金计算