PythonFlask-WTF文件上传进度条展示
Flask-WTF是使用Python语言编写的一个基于Flask框架的Web表单处理扩展,它提供了一组简单而强大的功能,可以帮助我们快速创建和处理表单。
文件上传是Web开发中常见的功能之一,但在上传大文件或者网络情况不好的情况下,用户可能会等待较长的时间才能完成文件上传。为了提升用户体验,我们可以使用进度条来展示文件上传的进度,让用户清楚地知道文件上传的进度。
下面将介绍如何使用Flask-WTF来展示文件上传的进度条。
首先,我们需要安装Flask-WTF库。可以使用以下命令进行安装:
pip install flask-wtf
接下来,我们需要创建一个Flask应用。在app.py文件中编写以下代码:
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from werkzeug.utils import secure_filename
import os
import time
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'
class UploadForm(FlaskForm):
file = FileField('File')
submit = SubmitField('Upload')
@app.route('/', methods=['GET', 'POST'])
def upload():
form = UploadForm()
if form.validate_on_submit():
file = form.file.data
filename = secure_filename(file.filename)
file.save(os.path.join('upload', filename))
return 'File uploaded successfully!'
return render_template('upload.html', form=form)
if __name__ == '__main__':
app.run()
在上面的代码中,我们首先导入了Flask、render_template和request模块,以及FlaskForm、FileField和SubmitField类。然后,我们创建了一个Flask应用,并设置了一个密钥。我们还定义了一个表单类UploadForm,其中包含一个FileField字段和一个SubmitField按钮。在路由函数中,我们实例化了这个表单类,并在GET请求时渲染了一个模板。在POST请求时,我们获取文件对象并保存在一个名为'upload'的文件夹中。
接下来,我们需要创建upload.html模板。在templates文件夹中创建一个名为upload.html的文件,并编写以下代码:
<!DOCTYPE html>
<html>
<head>
<title>File Upload Progress</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="{{ url_for('upload') }}">
{{ form.csrf_token }}
{{ form.file.label }}
{{ form.file }}
{{ form.submit }}
</form>
</body>
</html>
在上面的代码中,我们使用了Flask-WTF提供的模板渲染功能。我们在表单的头部部分使用了csrf_token字段,以防止CSRF攻击。然后,我们在表单中显示了FileField字段和SubmitField按钮。
在文件上传的过程中,我们需要通过JavaScript代码来监听文件上传的进度,并通过AJAX请求将进度传递到后台。下面是一个实现进度条功能的JavaScript代码:
function uploadFile() {
var form = $('form')[0];
var formData = new FormData(form);
$.ajax({
url: '/upload',
type: 'POST',
data: formData,
beforeSend: function() {
// 显示进度条
$('#progress').show();
},
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener('progress', function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total * 100;
$('#progress-bar').width(percentComplete + '%');
}
}, false);
return xhr;
},
success: function(res) {
// 文件上传成功
alert(res);
},
error: function(err) {
// 文件上传失败
alert('File upload failed!');
},
complete: function() {
// 上传完成,隐藏进度条
$('#progress').hide();
},
cache: false,
contentType: false,
processData: false
});
}
$('form').submit(function(e) {
e.preventDefault();
uploadFile();
});
上面的代码中,我们首先获取了表单以及表单的数据,然后通过AJAX请求将数据传递到后台。在xhr对象的upload属性中,我们监听了progress事件,并根据已经上传的数据量和总数据量来计算上传的百分比,然后设置进度条的宽度。在请求开始和完成后,我们分别显示和隐藏进度条。
最后,我们需要在upload.html模板中添加进度条的HTML代码。修改upload.html文件,并添加以下代码:
<!DOCTYPE html>
<html>
<head>
<title>File Upload Progress</title>
<style type="text/css">
#progress {
width: 100%;
height: 20px;
background-color: #f0f0f0;
display: none;
}
#progress-bar {
height: 100%;
background-color: #008000;
}
</style>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="{{ url_for('upload') }}">
{{ form.csrf_token }}
{{ form.file.label }}
{{ form.file }}
{{ form.submit }}
</form>
<div id="progress">
<div id="progress-bar"></div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js"></script>
<script src="static/js/upload.js"></script>
</body>
</html>
在上面的代码中,我们添加了一些CSS样式来定义进度条的外观。然后在表单的下方添加了一个div,用于显示进度条,并在底部引入了jQuery和我们编写的JavaScript代码。
通过运行以上代码,我们可以看到一个简单的文件上传表单,用户选择文件后,点击上传按钮,文件将会被上传到服务器,并在上传过程中显示进度条。
总结:在本文中,我们介绍了如何使用Flask-WTF来展示文件上传的进度条。通过使用Flask-WTF提供的功能,我们可以轻松地创建并处理表单。同时,通过使用JavaScript代码,我们可以监听文件上传的进度,并通过AJAX请求将进度传递到后台,以展示上传的进度条。
希望本文对你学习如何展示文件上传的进度条有所帮助!
