欢迎访问宙启技术站
智能推送

使用Flask实现文件上传和下载功能

发布时间:2023-12-23 07:00:50

Flask是一个轻量级的Python web框架,可以很方便地实现文件上传和下载功能。在Flask中,文件上传可以通过使用request对象的files属性来获取上传的文件,而文件下载则可以通过send_file函数来发送文件给客户端。

下面我们通过一个具体的例子来演示如何使用Flask实现文件上传和下载功能。

首先,我们需要在Python环境中安装Flask。可以通过以下命令来安装Flask:

pip install flask

接下来,我们创建一个Flask应用,并添加一个简单的文件上传和下载功能。

from flask import Flask, request, send_file

app = Flask(__name__)

# 设置允许上传的文件类型
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}

# 定义一个函数来判断文件扩展名是否合法
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# 定义一个路由来处理文件上传
@app.route('/upload', methods=['POST'])
def upload():
    # 检查是否有文件被上传
    if 'file' not in request.files:
        return 'No file uploaded', 400

    file = request.files['file']

    # 检查文件名是否合法
    if file and allowed_file(file.filename):
        # 保存上传的文件
        file.save(file.filename)
        return 'File uploaded successfully'
    else:
        return 'Invalid file', 400

# 定义一个路由来处理文件下载
@app.route('/download/<path:filename>', methods=['GET'])
def download(filename):
    # 检查文件是否存在
    if not os.path.isfile(filename):
        return 'File not found', 404

    # 发送文件给客户端
    return send_file(filename, as_attachment=True)

# 启动应用
if __name__ == '__main__':
    app.run()

在上面的代码中,我们先定义了一个allowed_file函数来判断上传的文件扩展名是否合法。然后,我们使用@app.route装饰器来定义了一个/upload路由,用于处理文件上传。在这个路由中,我们首先检查是否有文件被上传,然后检查文件名是否合法,最后保存上传的文件。如果文件上传成功,则返回一个成功的消息。

接着,我们使用@app.route装饰器定义了一个/download/<path:filename>路由,用于处理文件下载。在这个路由中,我们首先检查文件是否存在,然后使用send_file函数将文件发送给客户端。我们使用as_attachment=True参数来指定将文件作为附件下载。

最后,我们在if __name__ == '__main__':语句块中启动应用。当我们运行这个脚本时,Flask会监听在本地的默认端口(5000)上,并等待客户端的请求。

现在我们可以通过使用curl命令来测试文件上传和下载功能。以下是一些示例命令:

# 上传一个文件
curl -X POST -F "file=@filename.txt" http://localhost:5000/upload

# 下载一个文件
curl -O http://localhost:5000/download/filename.txt

在上面的示例中,我们使用了curl命令来模拟文件上传和下载的HTTP请求。通过指定-F参数可以将一个文件附加到POST请求中,而使用-O参数可以将服务器上的文件保存到本地。

通过上述的例子,我们可以看到,使用Flask实现文件上传和下载功能非常简单。Flask提供了很多方便的功能和工具,使得我们能够轻松地构建Web应用。同时,Flask还支持很多扩展,可以进一步增强应用的功能。