django admin 上传图片到s3然后调整图片大小和保存thumb问题

标签 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/但我不知道要喂它什么数据。即使主图像上传到 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 天了,所以我开始闲下来了!谢谢

最佳答案

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

所以代替

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


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

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

关于django admin 上传图片到s3然后调整图片大小和保存thumb问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5265543/

相关文章:

javascript - 如何使用 AJAX 将经纬度发送到 Django 服务器

python - 管理中的 Django _unaccent 和 _search

java - 如何使用 Maven 将 jar 部署到 S3?

python - 在 Django 模板中访问并行数组?

Django:为每个请求/表单生成新的 CSRF token

python - 必须在heroku上手动启动worker吗?

django - 我如何自动填充我的字段并使其在 django 管理站点中不可编辑

python - 如何在 Django admin 中包装文本(设置列宽)

amazon-web-services - 在S3上压缩整个目录

node.js - 在Node Js中不使用访问 key 和 secret key 将文件上传到S3 Bucket