首页 > 解决方案 > 无法使用 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 类型,我在这里做错了什么?

标签: pythonpython-3.xflaskflask-sqlalchemyflask-restful

解决方案


有点晚的答案 -

你需要做一些事情

imageD = base64.b64encode(files.read())

但是当您尝试“显示”它时,您的架构很可能会在自动转储/序列化时遇到问题。


推荐阅读