错误尝试上传并使用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天,所以我开始饶了!感谢
答案 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提供的完全相同的界面,并且看起来它比使用自己的支持更好。