Flask 文件处理: Werkzeug vs Flask-Uploads

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 的高级文件上传扩展,提供了更加简洁和易用的文件上传、下载和删除功能。根据实际需求,选择合适的文件处理方式可以极大地简化开发工作。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程