簡體   English   中英

從本地PNG創建Django文件會引發UnicodeDecodeError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM