Django 'File' 对象没有 'content_type' 属性

2 投票
2 回答
6099 浏览
提问于 2025-04-17 22:16

我正在定义一个函数,用来为每个上传到模型中的图片创建缩略图。下面是我的代码:

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)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言进行解释。

撰写回答