Pillow如何直接从StringIO打开上传的图像文件?

时间:2016-12-27 06:44:25

标签: python flask pillow stringio

用户通过表单上传图像文件,我不想将原始上传的图像文件保存到磁盘,并通过Pillow从磁盘打开图像来调整图像大小。

我想首先在内存中调整此图像文件的大小,然后将调整大小的图像文件保存到磁盘。所以我将StringIO作为缓冲区导入,但它不能与Pillow一起使用。

以下是代码:

Python3.4,Flask == 0.10.1,Pillow == 3.4.2

forms.py

from io import StringIO
from PIL import Image
from .forms import Form

@app.route('/upload_img', methods=['GET', 'POST'])
def upload_img():
    form = Form()
    im = Image.open(StringIO(form.img.data.read())

    pass

views.py

Kibana
  

TypeError:initial_value必须是str或None,而不是bytes

1 个答案:

答案 0 :(得分:5)

来自Pillow docs

  

PIL.Image.open(fp, mode='r')

     

打开并识别给定的图像文件。参数:

     

fp - 文件名(字符串),pathlib.Path对象或文件对象。文件对象必须实现read()seek()tell()方法,以及   以二进制模式打开。

您传递给open的内容是StringIO。它从 text 模式下打开的str对象创建一个类文件对象。
问题是由StringIO中的参数引起的。 form.img.data.read()返回一个bytes对象,禁止将其传递给构造函数。但在你的情况下,StringIO不会工作 相反,请使用io.BytesIO。它有几乎相同的接口,除了它需要bytes个对象并返回一个以二进制模式打开的类文件对象,这就是你需要的。

from io import BytesIO
from PIL import Image
from .forms import Form

@app.route('/upload_img', methods=['GET', 'POST'])
def upload_img():
    form = Form()
    im = Image.open(BytesIO(form.img.data.read())

    pass