上传 SimpleUploadedFile 时 BytesIO 流图像为空白
BytesIO stream image is blank when uploading SimpleUploadedFile
在我的模型保存方法中,我想生成一个头像并上传到 ImageField
(self.avatar)。
下面的代码运行了,但是当我查看时它上传的图像是空白的。我已经测试了生成器实际上是通过直接保存到磁盘而没有 BytesIO
流即 image.save("test.jpeg", format=filetype, optimize=True)
工作的,这是有效的。所以,问题似乎在于我如何使用 BytesIO
和 SimpleUploadedFile
.
保存方法
from .generate_avatar import Avatar
from django.core.files.uploadedfile import SimpleUploadedFile
avatar = Avatar.generate(128, self.display_name, "JPEG")
self.avatar = SimpleUploadedFile("temp.jpeg", avatar.read1(0))
生成方法
def generate(cls, size, string, filetype="JPEG"):
"""
Generates a squared avatar with random background color.
:param size: size of the avatar, in pixels
:param string: string to be used to print text and seed the random
:param filetype: the file format of the image (i.e. JPEG, PNG)
"""
render_size = max(size, Avatar.MIN_RENDER_SIZE)
image = Image.new('RGB', (render_size, render_size),
cls._background_color(string))
draw = ImageDraw.Draw(image)
font = cls._font(render_size)
text = cls._text(string)
draw.text(cls._text_position(render_size, text, font),
text,
fill=cls.FONT_COLOR,
font=font)
stream = BytesIO()
image = image.resize((size, size), Image.ANTIALIAS)
image.save(stream, format=filetype, optimize=True)
return stream
您需要重新设置文件位置。否则文件位置将在文件末尾;从那里读取将 return 空字节字符串。
avatar = Avatar.generate(128, self.display_name, "JPEG")
avatar.seek(0) # <---
self.avatar = SimpleUploadedFile("temp.jpeg", avatar.read())
在我的模型保存方法中,我想生成一个头像并上传到 ImageField
(self.avatar)。
下面的代码运行了,但是当我查看时它上传的图像是空白的。我已经测试了生成器实际上是通过直接保存到磁盘而没有 BytesIO
流即 image.save("test.jpeg", format=filetype, optimize=True)
工作的,这是有效的。所以,问题似乎在于我如何使用 BytesIO
和 SimpleUploadedFile
.
保存方法
from .generate_avatar import Avatar
from django.core.files.uploadedfile import SimpleUploadedFile
avatar = Avatar.generate(128, self.display_name, "JPEG")
self.avatar = SimpleUploadedFile("temp.jpeg", avatar.read1(0))
生成方法
def generate(cls, size, string, filetype="JPEG"):
"""
Generates a squared avatar with random background color.
:param size: size of the avatar, in pixels
:param string: string to be used to print text and seed the random
:param filetype: the file format of the image (i.e. JPEG, PNG)
"""
render_size = max(size, Avatar.MIN_RENDER_SIZE)
image = Image.new('RGB', (render_size, render_size),
cls._background_color(string))
draw = ImageDraw.Draw(image)
font = cls._font(render_size)
text = cls._text(string)
draw.text(cls._text_position(render_size, text, font),
text,
fill=cls.FONT_COLOR,
font=font)
stream = BytesIO()
image = image.resize((size, size), Image.ANTIALIAS)
image.save(stream, format=filetype, optimize=True)
return stream
您需要重新设置文件位置。否则文件位置将在文件末尾;从那里读取将 return 空字节字符串。
avatar = Avatar.generate(128, self.display_name, "JPEG")
avatar.seek(0) # <---
self.avatar = SimpleUploadedFile("temp.jpeg", avatar.read())