Flask 文件处理: Werkzeug vs Flask-Uploads
在本文中,我们将介绍 Flask 中的文件处理功能,并比较 Werkzeug 和 Flask-Uploads 这两种常用的文件处理扩展。
阅读更多:Flask 教程
1. Werkzeug
Werkzeug 是一个 WSGI 工具库,也是 Flask 的核心依赖之一。它提供了一些方便的工具函数和类,用于处理文件上传和下载等操作。
1.1 文件上传
Werkzeug 提供了 FileStorage
类,用于处理文件上传。使用 Werkzeug 进行文件上传的基本步骤如下:
1.1.1 在 HTML 表单中设置文件上传控件
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
1.1.2 在 Flask 路由中处理上传的文件
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files['file']
if file:
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return '文件上传成功'
else:
return '请选择要上传的文件'
上述代码中,request.files['file']
可以获取到上传的文件对象。通过 secure_filename
函数可以对文件名进行安全处理,防止路径遍历攻击。最后使用 file.save
方法保存文件到指定的文件夹中。
1.2 文件下载和静态文件处理
Werkzeug 还可以用于文件的下载和静态文件的处理。下面是一个使用 Werkzeug 返回文件的示例:
from werkzeug.wrappers import Response
@app.route('/download')
def download_file():
file_path = '/path/to/download/file.txt'
with open(file_path, 'rb') as f:
content = f.read()
response = Response(content, content_type='application/octet-stream')
response.headers['Content-Disposition'] = 'attachment; filename="file.txt"'
return response
上述代码中,通过读取文件内容并设置响应的 content_type 和 headers,可以实现文件的下载功能。
此外,Werkzeug 还通过 send_from_directory
函数提供了静态文件的处理功能。例如,可以使用以下代码将指定路径下的静态文件发送给客户端:
from werkzeug.utils import send_from_directory
@app.route('/static/<path:filename>')
def send_static_file(filename):
return send_from_directory('/path/to/static', filename)
2. Flask-Uploads
Flask-Uploads 是一个基于 Werkzeug 的 Flask 文件上传扩展,它提供了更加简洁和易用的文件上传功能。
2.1 文件上传
Flask-Uploads 的文件上传功能非常简单,只需通过在 Flask 应用中定义一个 UploadSet 对象,并指定允许上传的文件类型和保存路径即可。
2.1.1 安装 Flask-Uploads
pip install Flask-Uploads
2.1.2 在 Flask 应用中配置上传文件的设置
from flask import Flask
from flask_uploads import UploadSet, configure_uploads, IMAGES
app = Flask(__name__)
app.config['UPLOADED_PHOTOS_DEST'] = '/path/to/save/uploaded/files'
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
以上代码中,UploadSet
函数用于定义一个 UploadSet 对象,其中的 'photos'
是对象的名称,IMAGES
是允许上传的文件类型。
2.1.3 在 HTML 表单中设置文件上传控件
<form method="post" action="/upload" enctype="multipart/form-data">
{{ form.csrf_token }}
{{ form.photo }}
<input type="submit" value="上传">
</form>
2.1.4 在 Flask 路由中处理上传的文件
from flask_uploads import UploadNotAllowed
@app.route('/upload', methods=['POST'])
def upload_file():
if 'photo' in request.files:
try:
filename = photos.save(request.files['photo'])
return f"文件上传成功,文件名为:{filename}"
except UploadNotAllowed:
return '不允许上传此类型的文件'
else:
return '请选择要上传的文件'
上述代码中,photos.save
方法用于保存上传的文件,并返回保存后的文件名。如需自定义文件名,可以在 save
方法中指定 name
参数。
2.2 文件下载和删除
Flask-Uploads 还提供了方便的文件下载和删除功能。下面是一个使用 Flask-Uploads 返回文件的示例:
from flask import send_from_directory
@app.route('/download/<path:filename>')
def download_file(filename):
return send_from_directory(app.config['UPLOADED_PHOTOS_DEST'], filename, as_attachment=True)
上述代码中,使用 send_from_directory
函数从指定的文件夹中获取文件,并将其作为附件返回给客户端。
Flask-Uploads 还提供了 photos.delete
方法用于删除上传的文件,具体用法如下:
try:
photos.delete(filename)
return f"文件删除成功,文件名为:{filename}"
except FileNotFoundError:
return '文件不存在'
总结
本文介绍了 Flask 中的文件处理功能,并比较了 Werkzeug 和 Flask-Uploads 这两种常用的文件处理扩展。Werkzeug 提供了一些方便的工具函数和类,适用于一些简单的文件上传、下载和静态文件处理场景;而 Flask-Uploads 则是一个基于 Werkzeug 的高级文件上传扩展,提供了更加简洁和易用的文件上传、下载和删除功能。根据实际需求,选择合适的文件处理方式可以极大地简化开发工作。