上传SimpleUploadedFile时,BytesIO流图像为空白

时间:2015-07-29 08:00:34

标签: python django python-imaging-library pillow

在我的模型保存方法中,我想生成一个头像并上传到ImageField(self.avatar)。

以下代码会运行,但我查看时上传的图片为空白。我测试了生成器实际上是通过直接保存到磁盘没有BytesIO流即image.save("test.jpeg", format=filetype, optimize=True),这是有效的。因此,问题似乎在于如何使用BytesIOSimpleUploadedFile

保存方法

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

1 个答案:

答案 0 :(得分:2)

您需要重置文件位置。否则文件位置将在文件的末尾;从那里读取将返回空字节串。

avatar = Avatar.generate(128, self.display_name, "JPEG")
avatar.seek(0) # <---
self.avatar = SimpleUploadedFile("temp.jpeg", avatar.read())