[英]Creating Django File from local PNG raises UnicodeDecodeError
我正在使用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)
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文本?
確保以二進制模式打開文件描述符。
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.