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

Flask中使用MethodView()实现文件上传与下载

发布时间:2024-01-19 04:49:46

在Flask中,可以使用MethodView()类来实现文件上传与下载的功能。MethodView是一个视图类,可以通过继承MethodView来创建自定义视图,并实现不同HTTP方法对应的响应逻辑。

首先,我们需要导入所需的Flask模块和函数:

from flask import Flask, request, send_from_directory
from flask.views import MethodView
import os

接下来,创建一个Flask应用,并设置上传文件的保存路径:

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'

然后,定义一个继承自MethodView的视图类FileView,用于处理文件上传和下载的逻辑:

class FileView(MethodView):
    # 处理文件上传逻辑
    def post(self):
        file = request.files['file']
        if file:
            filename = file.filename
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return "文件上传成功"
        else:
            return "未选择文件"

    # 处理文件下载逻辑
    def get(self, filename):
        uploads = app.config['UPLOAD_FOLDER']
        return send_from_directory(directory=uploads, filename=filename, as_attachment=True)

post()方法中,我们首先获取上传的文件对象,然后判断是否成功获取到文件。如果成功获取到文件,我们使用save()函数将文件保存到指定的文件夹中。最后,返回文件上传成功的提示信息。

get()方法中,我们首先获取文件下载的文件名,然后使用send_from_directory()函数从指定文件夹中发送文件给客户端。as_attachment=True表示要将文件作为附件下载。

最后,将视图类注册到Flask应用中,并设置对应的路由:

app.add_url_rule('/file', view_func=FileView.as_view('file'))
app.add_url_rule('/file/<filename>', view_func=FileView.as_view('download'))

在这个例子中,我们将文件上传的路由设置为/file,并将视图类FileView绑定到这个路由上。同时,我们还设置了一个路由/file/<filename>用于文件下载,<filename>表示要下载的文件名。

完整的文件上传与下载的实现代码如下:

from flask import Flask, request, send_from_directory
from flask.views import MethodView
import os

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'

class FileView(MethodView):
    # 处理文件上传逻辑
    def post(self):
        file = request.files['file']
        if file:
            filename = file.filename
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return "文件上传成功"
        else:
            return "未选择文件"

    # 处理文件下载逻辑
    def get(self, filename):
        uploads = app.config['UPLOAD_FOLDER']
        return send_from_directory(directory=uploads, filename=filename, as_attachment=True)

app.add_url_rule('/file', view_func=FileView.as_view('file'))
app.add_url_rule('/file/<filename>', view_func=FileView.as_view('download'))

if __name__ == '__main__':
    app.run()

使用上述代码,我们可以通过向/file发送POST请求来上传文件,上传的文件将保存在uploads文件夹中。例如,可以使用curl命令来上传文件:

curl -X POST -F "file=@/path/to/file" http://localhost:5000/file

同样地,我们可以通过访问/file/filename来下载名为filename的文件,该文件将作为附件下载到本地。

以上就是使用MethodView()实现文件上传与下载的示例,代码已经包含了完整的上传和下载的逻辑。你可以根据需要进行适当的修改和扩展,以满足你的需求。