python - 无法使用 sqlalchemy 从烧瓶数据库中存储和获取图像
问题描述
我已经创建并配置了一个数据库,我能够发布图像或文件以外的数据,并且我能够获取这些数据,但我无法获取图像数据。我收到此错误
> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position > 0: invalid start byte
这是我的代码:
from app import app, api, db, ma, Resource, request, images_schema, image_schema, ImageData, json, jsonify
import base64
from base64 import b64encode
class AllImage(Resource):
def get(self):
images = ImageData.query.all()
print(images)
return images_schema.dump(images)
def post(self):
if 'image' in request.files:
imagedata = request.files['image']
imageD = imagedata.filename
imageD = imagedata.read()
image = ImageData(
uname = request.form['uname'],
fname = request.form['fname'],
lname = request.form['lname'],
email = request.form['email'],
# image = base64.b64encode(imageD)
image= imageD
)
db.session.add(image)
db.session.commit()
# return image_schema.dump(image)
print(type(image))
# return "success"
return image_schema.dump(image)
api.add_resource(AllImage,'/image/data')
这是我的数据库配置
from flask import Flask, json, jsonify, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow # new
from flask_restful import Api, Resource # new
from flask_cors import CORS
import datetime
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///image.db'
db = SQLAlchemy(app)
ma = Marshmallow(app)
api = Api(app)
CORS(app, resources={r"/loan/*": {"origins": "*"}})
class ImageData(db.Model):
id = db.Column(db.Integer, primary_key = True)
uname = db.Column(db.VARCHAR(20), nullable = True, unique=True)
fname = db.Column(db.VARCHAR(20), nullable = True)
lname = db.Column(db.VARCHAR(20), nullable = True)
email = db.Column(db.VARCHAR(50), nullable = True, unique=True)
# image = db.Column(db.LargeBinary, nullable=True)
image =db.Column(db.BLOB)
class ImageDataSchema(ma.Schema):
class Meta:
fields = ('id','uname','fname','lname','email','image')
image_schema = ImageDataSchema()
images_schema = ImageDataSchema(many=True)
我尝试了 largebinary 和 blob 类型,我在这里做错了什么?
解决方案
有点晚的答案 -
你需要做一些事情
imageD = base64.b64encode(files.read())
但是当您尝试“显示”它时,您的架构很可能会在自动转储/序列化时遇到问题。
推荐阅读
- c - 仅使用 gl.h 和 glu.h 编程 OpenGL
- python - 如何在Python中进行曲线下积分和阴影积分区域?
- c# - UWP:TextBox inside Button,如何防止SpaceBar触发Click事件?
- python - 如何在颜色条中间设置具有最小值的连续正颜色条范围
- casting - 转换为未调整大小的类型:`std::io::Stdout` as `std::io::Write` 错误
- javascript - 移动和桌面的不同事件
- python - 通过python进行文本解析
- r - 为什么并行 foreach 的求解速度异常缓慢?
- nsis - 如何强制 ReadRegStr 读取 32 位节点?
- r - 在 r + dplyr 中复制 Excel MAXIFS 函数