2015-03-25 261 views
2

我想将图像作为BLOB数据类型存储在我的sqlite数据库中,然后在我的网页上显示图像,但是我不断收到一个sqlalchemy错误(正在使用sqlalchemy我的ORM),错误:Python(flask)BLOB image,SQLite,sqlalchemy - display image

sqlalchemy.exc.StatementError 
StatementError: buffer object expected (original cause: TypeError: buffer object expected) u'INSERT INTO room (owner_name, size, description, price, address, owner_number, room_image, university_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' [{'owner_name': u'Thomas Jefferson', 'description': u'Master Bedroom, Non-furnished, toilet attached', 'price': u'RM650/Month', 'room_image': <FileStorage: u'udacity.png' ('image/png')>, 'university_id': 1, 'address': u'Cyber Heights Villa', 'size': u'325sqft', 'owner_number': u'+60111223456'}] 

这里是我的代码: 1)我的数据库安装文件(我在房间里表中的BLOB列):

import sys 
from sqlalchemy.dialects.sqlite import BLOB 
from sqlalchemy import Column, ForeignKey, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship 
from sqlalchemy import create_engine 
Base = declarative_base() 


class University(Base): 

    __tablename__ = "university" 

    #column definitions for the university table 
    id = Column(Integer, primary_key=True) 
    name = Column(String(250), nullable=False) 
    city = Column(String(80), nullable=False) 

    @property 
    def serialize(self): 
     #Returns object data in easilty serializable format 
     return{ 
      "name": self.name, 
      "city": self.city, 
      "id": self.id, 
     } 


class Room(Base): 

    __tablename__ = "room" 

    #column definitions for the room table 
    owner_name = Column(String(90), nullable=False) 
    id = Column(Integer, primary_key=True) 
    size = Column(String(60)) 
    description = Column(String(250)) 
    price = Column(String(10)) 
    address = Column(String(250)) 
    owner_number = Column(String(15)) 
    room_image = Column(BLOB) 
    university_id = Column(Integer, ForeignKey("university.id")) 
    university = relationship(University) 

engine = create_engine("sqlite:///gotroom.db") 
Base.metadata.create_all(engine) 

2)本是我的python文件代码,我打算允许将BLOB上传到room_image(ne wRoom功能就是上传相片图像要发生,并存储在room_image列在我的房间表):

#show rooms for a university 
@app.route("/university/<int:university_id>/") 
@app.route("/university/<int:university_id>/rooms/") 
def showRooms(university_id): 
    university = session.query(University).filter_by(id=university_id).one() 
    rooms = session.query(Room).filter_by(university_id=university_id).all() 
    return render_template("rooms.html", rooms=rooms, university=university) 


#create a new room for a particular university 
@app.route("/university/<int:university_id>/rooms/new/", methods=["GET", "POST"]) 
def newRoom(university_id): 
    if request.method == "POST": 
     aNewRoom = Room(owner_name=request.form["ownerName"], size=request.form["roomSize"]\ 
         , description=request.form["roomDescription"], price=request.form["roomPrice"]\ 
         , address=request.form["adress"], owner_number=request.form["phoneNum"], \ 
         room_image=request.files["roomImage"], university_id=university_id) 

     session.add(aNewRoom) 
     session.commit() 

     #feedback to user 
     flash("New Room Created")  

     return redirect(url_for("showRooms", university_id=university_id)) 
    else: 
     return render_template("newroom.html", university_id=university_id) 

3)这里是表单模板的代码创建一个新的房间“newroom.html “(我必须允许图像上传):

<form action="{{url_for('newRoom', university_id=university_id)}}" method="POST" enctype='multipart/form-data'> 
    <div class="row"> 
     <div class="col-md-4"> 
      <input type="text" class="form-control" name="ownerName" placeholder="Name"> 
     </div> 

     <div class="col-md-3"> 
      <input type="text" class="form-control" name="phoneNum" placeholder="Contact Number"> 
     </div> 

     <div class="col-md-5"> 
      <input type="text" class="form-control" name="adress" placeholder="Address"> 
     </div> 
    </div><!--first row--> 
    </br> 
    <div class="row"> 
     <div class="col-md-2"> 
      <input type="text" class="form-control" name="roomSize" placeholder="Room Size"> 
     </div> 

     <div class="col-md-2"> 
      <input type="text" class="form-control" name="roomPrice" placeholder="Room Price/Month"> 
     </div> 
    </div><!--second row--> 
    </br> 
    <div class="row"> 
     <div class="col-md-4" style="height: 100px"> 
      <input type="text" class="form-control" name="roomDescription" placeholder="Room Details" style="height: 100%"> 
     </div> 
     <input type='file' name='roomImage'> 
    </div> 
    </br> 

    <input type="submit" value="Post Room" class="btn btn-success btn-lg" role="button"> 

</form> 

4),这里是模板代码,我想显示所有包括图像的信息:

 </br> 

     <img src="{{room.room_image}}"> 
     <strong>Owner Name</strong>: {{room.owner_name}} 

     </br> 
     <strong>Contact Number</strong>: {{room.owner_number}} 
     </br> 
     <strong>Home Address</strong> : {{room.address}} 
     </br> 
     <strong>Room Price</strong> : {{room.price}} 
     </br> 
     <strong>Room Size</strong> : {{room.size}} 
     </br> 
     <strong>Room Description</strong>: {{room.description}} 
     <div> 

任何时候我删除图像,我没有得到错误,但只要我尝试显示图像,错误回来,可以请任何帮助我与此?我可以提供更多的细节或代码,如果需要

回答

1

从错误,似乎你正试图通过错误的类型。我相信BLOB期望一个二进制文件,而你正在传递一个PNG。有一个make_blob()方法可用于将图像转换为二进制文件。检查this页面,应该会有所帮助。