Django 'File' 对象没有 'content_type' 属性
我正在定义一个函数,用来为每个上传到模型中的图片创建缩略图。下面是我的代码:
def create_thumbnail(self):
if not self.coverphoto:
return
from PIL import Image
from cStringIO import StringIO
from django.core.files.uploadedfile import SimpleUploadedFile
import os
# Set our max thumbnail size in a tuple (max width, max height)
THUMBNAIL_SIZE = (200,200)
DJANGO_TYPE = self.coverphoto.file.content_type
if DJANGO_TYPE == 'image/jpeg':
PIL_TYPE = 'jpeg'
FILE_EXTENSION = 'jpg'
elif DJANGO_TYPE == 'image/png':
PIL_TYPE = 'png'
FILE_EXTENSION = 'png'
elif DJANGO_TYPE == 'image/gif':
PIL_TYPE = 'gif'
FILE_EXTENSION = 'gif'
# Open original photo which we want to thumbnail using PIL's Image
image = Image.open(StringIO(self.coverphoto.read()))
image.thumbnail(THUMBNAIL_SIZE, Image.ANTIALIAS)
# Save the thumbnail
temp_handle = StringIO()
image.save(temp_handle, PIL_TYPE)
temp_handle.seek(0)
# Save image to a SimpleUploadedFile which can be saved into
# ImageField
suf = SimpleUploadedFile(os.path.split(self.coverphoto.name)[-1],
temp_handle.read(), content_type=DJANGO_TYPE)
# Save SimpleUploadedFile into image field
self.coverphoto_thumbnail.save('%s_thumbnail.%s'%(os.path.splitext(suf.name)[0],FILE_EXTENSION), suf,save=False)
当我运行单元测试时,出现了错误:
'File' object has no attribute 'content_type'
错误提示指向的代码行是:
DJANGO_TYPE = self.coverphoto.file.content_type
因为我这个代码块是从一个旧的django示例中拿来的。我觉得这可能是因为django版本不同导致的。
请问我该如何在Django 1.6中检查内容类型?
有没有好的方法来解决这个问题?
谢谢。
2 个回答
2
我用以下方法解决了这个问题:
...
#DJANGO_TYPE = self.image.file.content_type
if self.image.name.endswith(".jpg"):
PIL_TYPE = 'jpeg'
FILE_EXTENSION = 'jpg'
DJANGO_TYPE = 'image/jpeg'
elif self.image.name.endswith(".png"):
PIL_TYPE = 'png'
FILE_EXTENSION = 'png'
DJANGO_TYPE = 'image/png'
...
对我来说有效。与其去查找内容类型,不如直接看文件的后缀名。如果你需要处理.gif或其他类型的文件,就需要查找正确的内容类型,并添加其他类似self.image.name.endswith(".gif")
的判断。
4
from mimetypes import MimeTypes
import urllib
mime = MimeTypes()
url = urllib.pathname2url(file_name)
mime_type = mime.guess_type(url)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言进行解释。