Flask和MongoDB:如何处理文件上传和下载

2023-04-15 00:00:00 下载 如何处理 文件上传

处理文件上传和下载是Web应用程序开发中的常见需求,Flask和MongoDB的结合可以很好地满足这一需求。下面详细介绍如何使用Flask和MongoDB处理文件上传和下载的过程以及对应的代码演示。

文件上传

1.配置MongoDB的GridFS存储引擎

MongoDB支持GridFS存储引擎,它可以将文件分块存储在MongoDB中,非常适合存储大文件。在Flask中使用GridFS需要用到pymongo模块。在安装好pymongo后,我们可以进行如下配置:

from pymongo import MongoClient
from gridfs import GridFS

client = MongoClient('localhost', 27017)
db = client['test_database']  # 数据库名称
fs = GridFS(db, collection='fs')  # GridFS的collection名称

2.配置Flask路由和视图函数

Flask提供了文件上传的插件Flask-Uploads,可以方便地处理文件上传。在安装好Flask-Uploads插件后,我们可以在Flask应用程序中进行如下配置:

from flask import Flask, request, url_for
from flask_uploads import UploadSet, configure_uploads, IMAGES

# 配置文件上传
app = Flask(__name__)
app.config['UPLOADED_PHOTOS_DEST'] = '/path/to/upload/folder'
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)

然后我们可以使用Flask-Uploads插件提供的上传文件视图函数进行文件上传了:

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'photo' in request.files:
        filename = photos.save(request.files['photo'])
        url = photos.url(filename)
        return 'pidancode.com/uploads/' + filename
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form method=post enctype=multipart/form-data>
      <p><input type=file name=photo>
         <input type=submit value=Upload>
    </form>
    '''

这里我们使用了Flask-Uploads提供的save()函数将上传的文件保存在指定目录下,并使用url()函数生成文件访问URL。

文件下载

1.在MongoDB中获取文件信息

通过collection的find_one()函数可以获取到指定文件的所有信息:

from bson.objectid import ObjectId

file_id = ObjectId('5fca5a5f5c2e3d3d512dd76d')  # 文件id
file_doc = fs.find_one({'_id': file_id})

2.提供下载接口

在Flask中提供下载接口有多种方式,这里我们使用Flask中的send_file()函数来实现:

from flask import send_file

@app.route('/download/<string:filename>')
def download(filename):
    file_doc = fs.find_one({'filename': filename})
    if file_doc is None:
        return 'File not found'
    else:
        file_id = file_doc['_id']
        return send_file(fs.get(file_id), as_attachment=True, attachment_filename=filename)

这里我们使用了send_file()函数来将文件发送给客户端。注意,参数as_attachment=True表示以附件形式下载,参数attachment_filename用于指定下载文件的文件名。

综上所述,通过Flask和MongoDB的结合,我们可以很方便地实现文件上传和下载的功能。

相关文章