Flask中使用MethodView()实现文件上传与下载
在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()实现文件上传与下载的示例,代码已经包含了完整的上传和下载的逻辑。你可以根据需要进行适当的修改和扩展,以满足你的需求。
