【问题标题】:Creating Django File from local PNG raises UnicodeDecodeError从本地 PNG 创建 Django 文件会引发 UnicodeDecodeError
【发布时间】:2017-09-26 23:57:20
【问题描述】:

我正在开发一个允许用户上传演示文稿的 Django Web 应用程序。演示文稿需要转换为图像,每张幻灯片一个,并且图像需要作为模型的一部分保存到 ImageField 中。但是,当我尝试将本地图像保存到模型时,Django 会在图像文件的标题上抛出 UnicodeDecodeError。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte

我做了一点阅读,发现这是 PNG 图像文件的有效标题的一部分。似乎无论出于何种原因,Django 都试图将二进制文件解码为 un​​icode。

这是我试图将图像保存到的模型:

class PresentationSlide(models.Model):
    ...
    image = models.ImageField(upload_to=upload_to)

upload_to 函数使用 base64 编码的 UUID 保存上传的文件。

在视图中,我验证表单,获取演示文件,并使用自定义库将其转换为临时目录中的单个图像。然后的想法是为这些图像中的每一个创建一个 PresentationSlide 实例。

以下是我尝试创建模型实例并保存图像的方法。

presentation = Presentation.objects.create(
    description=form.cleaned_data['description'])

slides = [PresentationSlide.objects.create(
    presentation=presentation, order=order,
    duration=form.cleaned_data['slide_interval'])
    for order, image in enumerate(slide_images)]

for image_path, slide in zip(sorted(slide_images), slides):
    with open(image_path) as image:
        slide.image.save(image.name, File(image))

是什么导致 Django 尝试将此二进制文件解码为 Unicode 文本?

【问题讨论】:

  • 您不需要在open 中指定mode 吗?
  • 至少在 python3 中你会得到一个默认的TextIOWrapperopen
  • 啊,我的问题。如果你写下这个问题的答案,我会接受。
  • 谢谢!相信我.. 我已经不止一次掉进那个洞了!

标签: python django image unicode upload


【解决方案1】:

确保以二进制模式打开文件描述符。

for image_path, slide in zip(sorted(slide_images), slides):
    with open(image_path, mode='rb') as image:
        slide.image.save(image.name, File(image))

默认情况下,open 将返回一个尝试解释文本的TextIOWrapper

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2012-08-08
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多