python - 从本地 PNG 创建 Django 文件引发 UnicodeDecodeError

标签 python django image unicode upload

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

UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 中的字节 0x89:起始字节无效

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

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

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

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

在 View 中,我验证表单,获取演示文稿文件,并使用自定义库将其转换为临时目录中的单个图像。然后的想法是为这些图像中的每一个创建一个 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 文本?

最佳答案

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

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

关于python - 从本地 PNG 创建 Django 文件引发 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43687418/

相关文章:

django - Heroku 在 git push 上删除文件?

python - 我的旧项目的 Django 1.7 迁移问题

python - Django 从 1.9 降级到 1.8

css - Bootstrap 小分辨率图像网格

python - 如何将连续值按规律的时间间隔序列分组?

python - 从 Python Flask API 返回空白

python - 如何在 OpenMesh 中为面着色?

python - 如何重写 django 模型删除方法以在删除时保存几个字段

HTML 图像未在电子邮件中定位

image - 如何在golang中将白色背景更改为透明?