亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Flask - 如何查詢 BLOB 圖像數據并將其顯示在 HTML / Jinja2 上?

Flask - 如何查詢 BLOB 圖像數據并將其顯示在 HTML / Jinja2 上?

侃侃爾雅 2023-04-11 15:30:54
所以,我有一個表單,用戶可以在其中發布標題、正文和上傳圖片。我從表單中獲取了該圖像并將其作為“Blob”保存到我的 Postgres 數據庫中。但是我有一個問題,我對如何查詢該圖像 blob 數據并解碼并將其顯示給用戶感到困惑。這些是我的表:class User(db.Model, UserMixin):    id = db.Column(db.Integer, primary_key=True)    email = db.Column(db.String(120), unique=True, nullable=False)    username = db.Column(db.String(30), unique=True, nullable=False)    password = db.Column(db.String(120), nullable=False)    date_joined = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)    posts = db.relationship('Post', backref='author', lazy=True, passive_deletes=True)class Post(db.Model):    id = db.Column(db.Integer, primary_key=True)    titl = db.Column(db.String(100), nullable=False)    body = db.Column(db.Text, nullable=False)    link = db.Column(db.LargeBinary)    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)    user_id = db.Column(db.Integer, db.ForeignKey( 'user.id', ondelete='CASCADE'), nullable=False)這是將 POST 和圖像保存到我的數據庫和靜態文件夾目錄的路徑:@app.route('/create/post', methods=['GET', 'POST'])def create_post():    # Image upload and validation    if request.method == 'POST':        if request.files:            if allowed_image_size(request.cookies.get('filesize')):                flash('Image exceeds the maximum size limit of 5 MB!', 'danger')                return redirect(request.url)            image = request.files['uploadImg']            if image.filename == '':                flash('No image detected or file name is empty!', 'danger')                return redirect(request.url)            if not allowed_images(image.filename):                flash('Invalid image extension!', 'danger')                return redirect(request.url)            else:                filename = secure_filename(image.filename)                image.save(os.path.join(app.config['IMAGE_UPLOADS'], image.filename))此外,當我查詢帖子以查看是否可以檢索數據時,使用類似的東西posts = Post.query.all()并使用print(posts.link.read()). 我收到一條錯誤消息AttributeError: 'list' object has no attribute 'link'
查看完整描述

1 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

我相信您應該將圖像作為路徑名存儲到您的帖子表中,而不是 blob。


在您的數據庫中將其更改為:


 link = db.Column(db.String(30))

然后在將帖子添加到數據庫時將圖像文件名路徑的字符串傳遞到帖子中


使用隨機字符串重命名文件也是一個好習慣,因為許多用戶可能會上傳,myCatPicture.jpg這會導致它覆蓋文件。


這樣的事情會做


def get_random_string(length):

    # Random string with the combination of lower and upper case

    letters = string.ascii_letters

    return ''.join(random.choice(letters) for i in range(length))

然后在保存圖像時保存新文件名


    if not allowed_images(image.filename):

        flash('Invalid image extension!', 'danger')

        return redirect(request.url)

    else:

        ext = os.path.splitext(file_name)[1]  # get the file extension

        new_filename = get_random_string(20)  # create a random string


        image.save(os.path.join(app.config['IMAGE_UPLOADS'], new_filename+ext))  # save with the new path

并在創建后使用新字符串。


post = Post(title=form.title.data,

                    body=form.body.data, link=os.path.join(app.config['IMAGE_UPLOADS'], new_filename+ext) , user_id=current_user.id)   #here we are substituting the old blod with the new stored image path string

筆記:


只要您將路徑存儲在數據庫中,文件名并不重要。您可以隨時查找它以獲取圖像/路徑。


...


然后在你的模板中(因為你已經有了所有的帖子)你可以開始一個 for 循環


{% for post in range(len(posts)) %}

    <h1> {{ post.title }} </h1>

    <img src= {{post.link }} >

    <p> {{ post.body }} </p>

{% endfor %}

這應該遍歷每個帖子標題、圖像和內容等。


同樣,我對此有點模糊。但認為這幾乎涵蓋了它。


查看完整回答
反對 回復 2023-04-11
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號