我有存储在GridFS中的文件。我想向用户显示文件列表,并允许他们下载它们。我有以下代码将文件保存到服务器,但我不知道如何将文件提供给客户端。如何使用Flask从GridFS提供文件?
<form id="submitIt" action="/GetFile" method="Post">
{% for file in List %}
<input type="checkbox" name="FileName" value={{file.strip('u').strip("'")}}>{{file.strip('u').strip("'")}}<br>
{% endfor %}
<a href="#" onclick="document.getElementById('submitIt').submit();">Download</a>
</form>
@app.route('/GetFile',methods=['POST'])
def GetFile():
connection = MongoClient()
db=connection.CINEfs_example
fs = gridfs.GridFS(db)
if request.method == 'POST':
FileName=request.form.getlist('FileName')
for filename in FileName:
EachFile=fs.get_last_version(filename).read()
with open(filename,'wb') as file2:
file2.write(EachFile)
return 'files downloaded'
答案 0 :(得分:1)
不是将从GridFS检索到的文件保存到服务器的文件系统,而是将其传递给客户端作为响应。您不能一次发送多个文件,因此您必须删除选择多个文件的功能。您根本不需要表单,只需在URL中传递名称并在模板中创建链接列表。
get_file.html
<ul>{% for name in names %}
<li><a href="{{ url_for('get_file', name=name) }}">{{ name }}</a></li>
{% endfor %}</ul>
:
qs_l2b_yearday.nc
答案 1 :(得分:1)
要将文件提供给客户端,您可以准备类似于此的视图:
@app.route('/client/serve/<file_id>/', methods=['GET', 'POST'])
@login_required
def serve_file(file_id):
from mongoengine.connection import get_db
from gridfs import GridFS, NoFile
from bson.objectid import ObjectId
from flask import make_response
db = get_db()
fs = GridFS(db)
try:
f = fs.get(ObjectId(file_id))
except NoFile:
fs = GridFS(db, collection='images') # mongoengine stores images in a separate collection by default
try:
f = fs.get(ObjectId(file_id))
except NoFile:
raise ValueError("File not found!")
response = make_response(f.read())
response.mimetype = 'image/jpeg'
return response