如何使用 flask-wtf 上传多个文件?
How to upload multiple files with flask-wtf?
我正在尝试使用 flask-wtf 上传多个文件。我可以毫无问题地上传单个文件,并且我已经能够更改 html 标签以接受多个文件,但到目前为止我无法获得比第一个文件更多的文件。
附加代码会给我第一个文件,但我不知道如何从中获取更多文件。我怀疑 "render_kw={'multiple': True}" 只是更改了 HTML 标签,所以我可能用这种方法找错了树。我也从 wtforms 中偶然发现了 "MultipleFileField",但我似乎无法将其添加到 return 任何文件,同样可能是因为它与我正在尝试的 flask_wtf 不兼容使用。有什么好的方法吗?
@app.route('/', methods=['GET', 'POST'])
def upload():
form = Upload_Form(CombinedMultiDict((request.files, request.form)))
if form.validate_on_submit():
files = form.data_file.data
files_filenames = secure_filename(files.filename)
data.save(os.path.join(app.config['UPLOAD_FOLDER'], data_filename))
print(files_filenames)
return render_template('input_form.html', form=form)
return render_template('input_form.html', form=form)
class Upload_Form(FlaskForm):
data_file = FileField(render_kw={'multiple': True}, validators=[FileRequired(), FileAllowed(['txt'], 'text files only')])
<!--input_form.html--->
<form method=post enctype="multipart/form-data">
<table>
{{ form.hidden_tag() }}
{% for field in form %}
<tr>
<td>{% if field.widget.input_type != 'hidden' %} {{ field.label }} {% endif %}</td><td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<p><input type=submit value=Compute></form></p>
这是第一个文件 return,但我需要它才能 return 选择所有文件。列表将是最有用的,但我可以解压的任何数据结构都可以使用。谢谢
不使用 FileField,而是使用 MultipleFileField。它支持多个文件。
例如:
from wtforms import MultipleFileField
class NewFileForm(FlaskForm):
files = MultipleFileField('File(s) Upload')
然后访问文件:
@app.route('/', methods=['GET', 'POST'])
def upload():
form = NewFileForm()
if form.validate_on_submit():
files_filenames = []
for file in form.files.data:
file_filename = secure_filename(file.filename)
data.save(os.path.join(app.config['UPLOAD_FOLDER'], data_filename))
files_filenames.append(file_filename)
print(files_filenames)
return render_template('input_form.html', form=form)
return render_template('input_form.html', form=form)
from wtforms import MultipleFileField
from werkzeug.utils import secure_filename
class Upload_Form(FlaskForm):
files = MultipleFileField(render_kw={'multiple': True})
和路线
@app.route('/', methods=['GET', 'POST'])
def upload():
form = Upload_Form()
if form.validate_on_submit():
for file in form.files.data:
file_name = secure_filename(file.filename)
file.save(file_name)
我正在尝试使用 flask-wtf 上传多个文件。我可以毫无问题地上传单个文件,并且我已经能够更改 html 标签以接受多个文件,但到目前为止我无法获得比第一个文件更多的文件。
附加代码会给我第一个文件,但我不知道如何从中获取更多文件。我怀疑 "render_kw={'multiple': True}" 只是更改了 HTML 标签,所以我可能用这种方法找错了树。我也从 wtforms 中偶然发现了 "MultipleFileField",但我似乎无法将其添加到 return 任何文件,同样可能是因为它与我正在尝试的 flask_wtf 不兼容使用。有什么好的方法吗?
@app.route('/', methods=['GET', 'POST'])
def upload():
form = Upload_Form(CombinedMultiDict((request.files, request.form)))
if form.validate_on_submit():
files = form.data_file.data
files_filenames = secure_filename(files.filename)
data.save(os.path.join(app.config['UPLOAD_FOLDER'], data_filename))
print(files_filenames)
return render_template('input_form.html', form=form)
return render_template('input_form.html', form=form)
class Upload_Form(FlaskForm):
data_file = FileField(render_kw={'multiple': True}, validators=[FileRequired(), FileAllowed(['txt'], 'text files only')])
<!--input_form.html--->
<form method=post enctype="multipart/form-data">
<table>
{{ form.hidden_tag() }}
{% for field in form %}
<tr>
<td>{% if field.widget.input_type != 'hidden' %} {{ field.label }} {% endif %}</td><td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<p><input type=submit value=Compute></form></p>
这是第一个文件 return,但我需要它才能 return 选择所有文件。列表将是最有用的,但我可以解压的任何数据结构都可以使用。谢谢
不使用 FileField,而是使用 MultipleFileField。它支持多个文件。
例如:
from wtforms import MultipleFileField
class NewFileForm(FlaskForm):
files = MultipleFileField('File(s) Upload')
然后访问文件:
@app.route('/', methods=['GET', 'POST'])
def upload():
form = NewFileForm()
if form.validate_on_submit():
files_filenames = []
for file in form.files.data:
file_filename = secure_filename(file.filename)
data.save(os.path.join(app.config['UPLOAD_FOLDER'], data_filename))
files_filenames.append(file_filename)
print(files_filenames)
return render_template('input_form.html', form=form)
return render_template('input_form.html', form=form)
from wtforms import MultipleFileField
from werkzeug.utils import secure_filename
class Upload_Form(FlaskForm):
files = MultipleFileField(render_kw={'multiple': True})
和路线
@app.route('/', methods=['GET', 'POST'])
def upload():
form = Upload_Form()
if form.validate_on_submit():
for file in form.files.data:
file_name = secure_filename(file.filename)
file.save(file_name)