【问题标题】:Saving multiple files through flask and wtforms MultipleFileField通过flask和wtforms MultipleFileField保存多个文件
【发布时间】:2020-09-02 18:11:56
【问题描述】:

我正在尝试使用 MultipleFileField 从 Flask 中的请求中获取和保存多个文件。但问题是我无法遍历它。我的意思是:
表单类

class TestForm(FlaskForm):
    user_id = IntegerField('user_id', validators=[DataRequired()])
    name = StringField('name', validators=[DataRequired()])
    description = StringField('description', validators=[DataRequired()])
    category_id = IntegerField('category_id', validators=[DataRequired()])
    date_of_purchase = DateField('date_of_purchase', validators=[DataRequired()])
    guarantee_period = IntegerField('guarantee_period', validators=[DataRequired()])
    files = MultipleFileField('files')

并查看代码:

form = TestForm()
...
files = form.files
for file in files:
   with open(path.join('some_path', file.filename), 'wb') as f:
        f.write(file.read())

我收到了这么多的请求:

["<_io.BufferedReader name='1.jpg'>", "<_io.BufferedReader name='2.jpg'>"]

但我得到了错误:

AttributeError: 'str' object has no attribute 'filename'

因此它将io.BufferedReader 转换为str。我该怎么做才能解决这个问题?

【问题讨论】:

  • 我没用过MultipleFileField,但有了FileField,你只需要form.file.data.save(path)。这在这种情况下是否有效(例如,在你的循环中只做一个file.data.save(path) 或类似的东西)?
  • @noslenkwah 不,它不一样。我也试过了。
  • @noslenkwah 在这种情况下 form.file.data 返回列表,io.BufferedReader 转换为字符串
  • 只是类名
  • 我试过了。我找到了答案here

标签: python flask flask-wtforms wtforms


【解决方案1】:

您的“文件”是一个字符串,在 with 语句之前将其切片并保存到文件名变量,然后在 with 语句中仅包含“文件名”。比如:

form = TestForm()
...
files = form.files.data
for file in files:
   with open(path.join('some_path', file), 'wb') as f:
        f.write(file.read())

【讨论】:

  • 它没有帮助(错误是TypeError: 'MultipleFileField' object is not iterable
  • 我刚刚编辑了答案,.data 将表单中的所有内容作为一个列表,这可能是你需要的
  • 嗯,我今天早上又试了一遍你的代码,效果很好......我只是无法想象昨天有什么问题)
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2022-07-21
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多