Flask 形式图像到 base64 字符串

Flask Form Image to base64 string

我创建了一个可以上传图片的 Flask 表单。然后我需要将该图像转换为 base64 字符串,但我总是得到相同的结果。 我的打印输出:

<FileStorage: '20190925_184412.jpg' ('image/jpeg')>
b''

和代码

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField
from flask_uploads import configure_uploads, IMAGES, UploadSet
import base64
app = Flask(__name__)

app.config['SECRET_KEY'] = 'thisisasecret'
app.config['UPLOADED_IMAGES_DEST'] = 'uploads/images'

images = UploadSet('images', IMAGES)
configure_uploads(app, images)


class MyForm(FlaskForm):
    image = FileField('image')


@app.route('/', methods=['GET', 'POST'])
def index():
    form = MyForm()

    if form.validate_on_submit():
        filename = images.save(form.image.data)
        image_string = base64.b64encode(form.image.data.read())
        print(form.image.data)
        print(image_string)
        return f'Filename: { filename }'

    return render_template('index.html', form=form)

我认为这是由于 Werkzeug 的 FileStorage 对象的工作方式所致。正如我 它有一个 stream 属性;这是 tempfile.SpooledTemporaryFile 类型,因此如果您想再次阅读,则必须在阅读后 re-wound。

在您的情况下,此流属性是:form.image.data.stream。我怀疑当您调用方法 images.save.

时,这会被读取一次

所以解决方案应该是在计算 b64 字符串之前倒回该流:

   if form.validate_on_submit():
        filename = images.save(form.image.data) # first read happens here

        form.image.data.stream.seek(0)

        image_string = base64.b64encode(form.image.data.read())
        print(form.image.data)
        print(image_string)
        return f'Filename: { filename }'