【问题标题】:Uploading multiple files with Flask使用 Flask 上传多个文件
【发布时间】:2012-08-02 18:27:16
【问题描述】:

有没有办法用 Flask 接收多个上传的文件?我尝试了以下方法:

<form method="POST" enctype="multipart/form-data" action="/upload">
  <input type="file" name="file[]" multiple="">
  <input type="submit" value="add">
</form>

然后打印request.files['file']的内容:

@app.route('/upload', methods=['POST'])
def upload():
  if not _upload_dir:
    raise ValueError('Uploads are disabled.')

  uploaded_file = flask.request.files['file']
  print uploaded_file
  media.add_for_upload(uploaded_file, _upload_dir)
  return flask.redirect(flask.url_for('_main'))

如果我上传多个文件,它只打印集合中的第一个文件:

<FileStorage: u'test_file.mp3' ('audio/mp3')>  

有没有办法使用 Flask 的内置上传处理接收多个文件?感谢您的帮助!

【问题讨论】:

  • "file[]" 中的括号可以跳过,name="file" 可以使用。

标签: python file-upload flask


【解决方案1】:

你可以使用flask.request.files的方法getlist,例如:

@app.route("/upload", methods=["POST"])
def upload():
    uploaded_files = flask.request.files.getlist("file[]")
    print uploaded_files
    return ""

【讨论】:

  • 我试过了,但它说'flask'没有定义。我哪里错了?我需要导入哪些模块?
  • 来自烧瓶导入请求
  • 方括号不是必须的。
  • 在 Flask 0.12.2 上没有方括号对我不起作用
  • 在 Flask 1.0.2 中,我得到了一个包含方括号的空列表,以及不包含的正确文件列表。
【解决方案2】:

这是烧瓶版本“1.0.2”的有效解决方案:

images = request.files.to_dict() #convert multidict to dict
for image in images:     #image will be the key 
    print(images[image])        #this line will print value for the image key
    file_name = images[image].filename
    images[image].save(some_destination)

基本上,images[image] 有一个添加了保存功能的图像文件 现在对数据做任何你喜欢做的事情。

【讨论】:

  • to_dict 没有得到图片列表。
  • @TomSawyer 您使用的是哪个烧瓶版本?你能把 print(type(request.files)) 放在你的代码中,看看 request.files 的类型是什么。如果它是 multidict 那么 to_dict 方法应该给你一个字典对象作为回报。
  • @Jean-François Fabre 这也是flask 2.0.1 的工作解决方案,但是当我在JS 中使用FormData 时,to_dict 似乎并不是整个文件列表。它只获取第一个文件,我做错了吗?
  • @collinsmarra 在 for 循环之前打印图像,看看你得到了什么我在许多项目中使用此代码,它会根据我从客户端发送的内容返回一个文件或多个文件.如果可能,请检查客户端 JS 上的代码。你可能会在那里找到线索。
【解决方案3】:

使用 Flask 1.0.2+:

files = request.files.getlist("images")

其中images 是键/值对的键。值是多张图片。

【讨论】:

  • 谢谢!由于它可能有助于其他人阻止某些搜索,请注意file.filenamefiles 中的每个file 提供了文件的名称。
【解决方案4】:
@app.route('/upload', methods=['GET','POST'])
def upload():
    if flask.request.method == "POST":
        files = flask.request.files.getlist("file")
        for file in files:
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))

它对我有用。

对于 UPLOAD_FOLDER,如果您需要在 app = flask.Flask(name)

之后添加它
UPLOAD_FOLDER = 'static/upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2019-05-22
    • 1970-01-01
    • 2016-06-09
    • 2020-05-26
    • 2018-03-02
    • 2017-04-10
    • 2022-07-21
    相关资源
    最近更新 更多