【发布时间】:2019-09-17 18:21:03
【问题描述】:
在我的表单上,我有一个 ImageField 和一个隐藏的 CharField 来接受作为 base64 的图像。当用户在前端表单上选择图像时,我在前端的 JS 脚本会自动将图像大小调整为画布,然后将生成的 dataUrl 设置为 CharField 的内容。我希望在提交表单时,我可以将 base64 文本转换为图像并覆盖 ImageField 中原始图像的保存,以便将解码后的 base64 图像保存在其位置(文件名和所有)。
我遵循了几个在线教程,这些教程帮助我制定了以下代码。我已经覆盖了forms.py 中的clean() 函数,以便将base64 文本解码为PIL 图像。现在我想将其设置为实际 ImageField 的内容,以便将其保存和处理,就好像 base64 解码的图像是在 POST 中发送的文件一样。
其他答案建议使用 with open() 命令手动保存解码的 base64 图像,但这种方法会带来其他麻烦。特别是因为如果使用已经存在的名称提交图像,Django 已经处理图像重命名。我宁愿不必为此重新制造轮子。在通过 Django 的内置方法保存之前用生成的文件替换 ImageField 文件似乎是最好的方法。
我想要的方法有什么可行的方法吗?我没有找到任何试图处理这种情况的答案,而无需自己手动保存文件并在之后更新模型。
from PIL import Image
from io import BytesIO
import os
import sys
import re
import base64
def clean(self):
cleaned_data = super().clean()
dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$')
ImageData = cleaned_data.get("image_base64_text")
ImageData = dataUrlPattern.match(ImageData).group(2)
ogImg = cleaned_data.get("image")
# If none or len 0, means illegal image data
if (ImageData == None or len(ImageData) == 0):
# PRINT ERROR MESSAGE HERE
print('corrupt or illegal image data')
# Decode the 64 bit string into 32 bit
ImageData = base64.b64decode(ImageData)
ImageData = Image.open(BytesIO(ImageData))
【问题讨论】:
标签: javascript python django html5-canvas