使用Flask从GridFS列出并提供文件

时间:2015-09-10 03:11:58

标签: python mongodb flask

我有存储在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'

2 个答案:

答案 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