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

PythonFlask-WTF文件上传和下载进度展示

发布时间:2023-12-11 06:21:39

在使用Python Flask开发Web应用时,经常会遇到文件上传和下载的需求。而在文件上传和下载的过程中,为了提高用户体验,通常需要展示文件传输的进度。

为了实现文件上传和下载进度展示的功能,我们可以使用Python Flask-WTF库。Flask-WTF是一个Flask扩展,提供了处理Web表单的功能,包括文件上传和Form表单验证。

在使用Flask-WTF实现文件上传和下载进度展示的功能之前,我们需要进行一些准备工作。

首先,我们需要安装Flask-WTF库。可以使用pip命令进行安装:

pip install Flask-WTF

在安装了Flask-WTF库之后,我们需要在Flask应用中导入必要的库和模块,并配置Flask-WTF的密钥。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import FileField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

接下来,我们需要定义一个FlaskForm表单类,用于接收文件上传的表单数据。

class UploadForm(FlaskForm):
    file = FileField()

在上传文件的请求处理函数中,我们需要实例化这个表单类,并在模板中渲染表单。

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    form = UploadForm()
    if request.method == 'POST' and form.validate_on_submit():
        file = form.file.data
        file.save('uploads/' + file.filename)
        return 'File uploaded successfully!'
    return render_template('upload.html', form=form)

在模板中,我们需要使用Flask-WTF提供的form.hidden_tag()form.file()函数渲染表单。

<form method="post" enctype="multipart/form-data">
    {{ form.hidden_tag() }}
    {{ form.file(class="form-control-file") }}
    <button type="submit" class="btn btn-primary">Upload</button>
</form>

这样就完成了文件上传的功能。

接下来,我们需要实现文件下载进度展示的功能。

首先,我们需要在Flask应用中导入必要的库和模块。

import os
from flask import Flask, render_template, send_file, request
from flask_wtf import FlaskForm
from wtforms import StringField
from werkzeug.utils import secure_filename
from werkzeug.wrappers import Response

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

我们定义一个表单类,用于接收文件下载的表单数据。

class DownloadForm(FlaskForm):
    filename = StringField('Filename')

在文件下载的请求处理函数中,我们需要实例化这个表单类,并在模板中渲染表单。

@app.route('/download', methods=['GET', 'POST'])
def download():
    form = DownloadForm()
    if request.method == 'POST' and form.validate_on_submit():
        filename = secure_filename(form.filename.data)
        return Response(file_stream('uploads/' + filename), mimetype='application/octet-stream')
    return render_template('download.html', form=form)

在模板中,我们需要使用Flask-WTF提供的form.hidden_tag()form.file()函数渲染表单。

<form method="post">
    {{ form.hidden_tag() }}
    {{ form.filename(class="form-control") }}
    <button type="submit" class="btn btn-primary">Download</button>
</form>

这样就完成了文件下载的功能。

为了展示文件上传和下载的进度,我们需要对文件上传和下载的请求进行一些改造。

首先,我们需要定义一个函数,用于计算文件的大小。

def get_file_size(filepath):
    size = os.path.getsize(filepath)
    return size

接下来,我们需要定义一个带进度条的文件流函数,用于发送文件。

def file_stream(filepath):
    def generate():
        total_size = get_file_size(filepath)
        bytes_sent = 0
        with open(filepath, 'rb') as f:
            while True:
                chunk = f.read(1024)
                if not chunk:
                    break
                bytes_sent += len(chunk)
                progress = int((bytes_sent / total_size) * 100)
                yield (chunk, progress)
    return Response(generate(), mimetype='application/octet-stream')

最后,我们需要修改文件下载的请求处理函数,使其返回带有进度条的文件流。

@app.route('/download', methods=['GET', 'POST'])
def download():
    form = DownloadForm()
    if request.method == 'POST' and form.validate_on_submit():
        filename = secure_filename(form.filename.data)
        return file_stream('uploads/' + filename)
    return render_template('download.html', form=form)

在模板中,我们需要使用Flask-WTF提供的form.hidden_tag()form.file()函数渲染表单。

<form method="post">
    {{ form.hidden_tag() }}
    {{ form.filename(class="form-control") }}
    <button type="submit" class="btn btn-primary">Download</button>
</form>

这样就完成了文件下载进度展示的功能。

以上就是使用Python Flask-WTF实现文件上传和下载进度展示的方法,希望对你有所帮助。