Flask 和 sqlalchemy:使用存储在数据库中的路径获取上传的文件
Flask and sqlalchemy: Get uploaded file using path stored on database
我正在使用 flask 和 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 的内容并且有文件的完整路径。如果我点击link,我可以访问,但是图片不会显示在标签内...
我尝试使用以下方法将其添加到模板中:
<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有关吗?
提前致谢!!
嗯,这很奇怪,但我会回答我自己的问题。
解决方法很简单,我选择只在数据库中存储文件名。
然后我创建了一个到视图的路由,该视图将使用 flask.ext.uploads
中的 send_from_directory
函数 return 文件
@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
。
我正在使用 flask 和 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 的内容并且有文件的完整路径。如果我点击link,我可以访问,但是图片不会显示在标签内...
我尝试使用以下方法将其添加到模板中:
<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有关吗?
提前致谢!!
嗯,这很奇怪,但我会回答我自己的问题。
解决方法很简单,我选择只在数据库中存储文件名。
然后我创建了一个到视图的路由,该视图将使用 flask.ext.uploads
send_from_directory
函数 return 文件
@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
。