【问题标题】:Flask and sqlalchemy: Get uploaded file using path stored on databaseFlask 和 sqlalchemy:使用存储在数据库中的路径获取上传的文件
【发布时间】:2015-07-26 01:54:38
【问题描述】:

我正在使用烧瓶和 sqlalchemy,但我遇到了关于文件上传的问题。

我正在上传带有表单的文件并将 URL 存储到数据库中,因此我可以在页面内部显示它。

这是表单的代码:

        boxart = request.files['boxart']

        if boxart:
            filename = secure_filename(boxart.filename)
            boxart_path = os.path.join(app.config['UPLOAD_FOLDER']+"boxart/", filename)
            boxart.save(boxart_path)
            game_son.boxart = boxart_path

        db.session.add(game_son)
        db.session.commit()

所以我转到我的模板,我可以打印 game_son.boxart 的内容,并且有文件的完整路径。如果我点击链接,我可以访问,但图像不会显示在标签内......

我尝试使用以下方法在模板上获取它:

    <img src="{{ game_son.boxart_url() }}" />

在模型内部,我定义了一个 boxart_url 方法,以防我需要在发送之前解析字符串

  class Game_son(db.Model):
    __searchable__ = ['version_name']
    son_id = db.Column(db.Integer, primary_key=True)
    version_name = db.Column(db.String(128), index=True, unique=False)
    son_timestamp = db.Column(db.DateTime)
    dad = db.Column(db.Integer, db.ForeignKey('game_dad.id'))
    console = db.Column(db.Integer, db.ForeignKey('platform.id'))
    boxart = db.Column(db.String(256))
    thumbnail = db.Column(db.String(256))
    genre = db.Column(db.String(32))
    subgenre = db.Column(db.String(32))

    def boxart_url(self):
        return self.boxart 

    def __repr__(self):
        return '<Game %r>: %r' % (self.version_name, self.dad)

页面视图只是将整个对象(游戏)发送到页面。

到达页面的url是:

/home/removed_my_pc_user/app/media/boxart/image.jpg

编辑: 我只记得我在项目中使用了虚拟环境。

和chmod有关吗?

提前致谢!!

【问题讨论】:

  • 在模板中显示图像的代码在哪里?你是如何从数据库中取回数据的?您提供了插入语句,但这并不能帮助我们解决您的问题,因为它没有显示在图像标签中。
  • 谢谢。我在问题中添加了更多信息。如果还有其他事情,请告诉我。
  • 查看源码时,你的img标签的src是什么?
  • 那么,当您查看图像并且它可以工作时,网址会是这样的吗? 127.0.0.1:1234/home/removed_my_user/app/media/boxart/image.jpg

标签: python flask flask-sqlalchemy flask-wtforms


【解决方案1】:

嗯,这很奇怪,但我会回答我自己的问题。

解决方案很简单,我选择只将文件名存储在数据库中。

然后我创建了一个到视图的路由,该视图将使用来自flask.ext.uploadssend_from_directory 函数返回文件

@app.route('/boxart/<filename>')
    def uploaded_boxart(filename):
        return send_from_directory(app.config['UPLOAD_FOLDER'],filename)

因此,在模板中,我们可以使用url_for() 函数来加载文件,将存储在数据库中的文件名作为参数发送。

<img src="{{ url_for('uploaded_boxart', filename = game_son.boxart)}}" />

另外,我认为我的错误之一是将 media/ 文件夹放在 app/ 文件夹中,而不是放在根目录中。所以我也在app.config中重新配置了UPLOAD_FOLDER

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2018-06-19
    • 2021-01-02
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多