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 }'
我创建了一个可以上传图片的 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 }'