【问题标题】:Django admin upload and image to s3 and then resize the image and save a thumb problemdjango admin上传和图片到s3然后resize图片并保存thumb问题
【发布时间】:2011-07-13 00:57:57
【问题描述】:

我在尝试使用 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 sn-p - http://djangosnippets.org/snippets/224/ 但我不知道要提供什么数据。即使主图像可以正常上传到 s3,我也会得到相同的 IOErrors 和“没有这样的路径/文件名”。我也尝试过:

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 天,所以我开始有空了!谢谢

【问题讨论】:

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


    【解决方案1】:

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

    所以不是

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

    使用

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

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

    【讨论】:

    • 感谢您的回答。想知道是否有办法使用 django 存储来做类似抽象的事情,无论它是使用本地存储还是 s3 存储。
    【解决方案2】:

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

    • 存储支持
    • 可插拔引擎支持(PIL、pgmagick)
    • 可插拔键值存储支持(redis、缓存数据库)
    • 可插拔后端支持
    • 可以删除的管理员集成
    • 虚拟生成
    • 灵活、简单的语法,不生成html
    • 删除缩略图的模型的 ImageField
    • CSS 样式裁剪选项
    • 垂直定位的边距计算

    【讨论】:

    • 我回家后会试一试。我试图自己做,但我想使用效果更好的其他人是更明智的做法!
    • 我尝试了 sorl-thumbnail,它很棒!似乎不能让它在后端工作,但对于模板来说,它就在现场。感谢您的帮助:-)
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2012-05-28
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多