jak*_*gut 2 python django unicode upload image
我正在开发一个允许用户上传演示文稿的 Django 网络应用程序。演示文稿需要转换为图像,每张幻灯片一张,图像需要作为模型的一部分保存到 ImageField。但是,当我尝试将本地图像保存到模型时,Django 在图像文件的标题上抛出了 UnicodeDecodeError。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
我做了一些阅读,发现这是 PNG 图像文件的有效标头的一部分。似乎无论出于何种原因,Django 都试图将二进制文件解码为 unicode。
这是我试图将图像保存到的模型:
class PresentationSlide(models.Model):
...
image = models.ImageField(upload_to=upload_to)
Run Code Online (Sandbox Code Playgroud)
该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))
Run Code Online (Sandbox Code Playgroud)
是什么导致 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))
Run Code Online (Sandbox Code Playgroud)
默认情况下open将返回一个TextIOWrapper试图解释文本的。
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |