Как перебирать файлы в запросе, не зная их имени в Flask

#python #flask

#python #flask

Вопрос:

У меня есть REST API, который должен иметь универсальный загрузчик файлов для временных файлов. Проблема в том, что эти файлы могут поступать из нескольких частей пользовательского интерфейса, и все эти части имеют разные свойства имени для ввода файла, который отвечает за отправку файла.

Например:

 <input type="file" name={"image"} /> // Somewhere in the UI in a form
<input type="file" name="video" /> // somewhere else in the UI in a different form, or possibly a different UI even
  

Здесь, например, у меня есть 2 поля ввода, которые должны отправлять свои файлы по одному и тому же маршруту, но с другим именем. Предположим, что имя может меняться, и нет способа написать какую-либо логику переключения / обращения или if / else для определения всех имен, которые встречаются в пользовательском интерфейсе, поскольку существует несколько пользовательских интерфейсов, созданных разными людьми. Мне нужно сделать это как можно более универсальным.

Как мне получить файл из request.files диктонара, если я не знаю имя поля ввода, которое используется для идентификации файла в запросе? Я попытался распечатать файл, но получаю пустой dict.

Я попытался выполнить for in цикл через request.files dict следующим образом:

 files = request.files
print(files["image"]
for f in files:
    print(f)
  

но это не сработало. Я только что снова получил пустой dict, несмотря на подтверждение того, что файл находится в запросе с печатью в строке 2.

Тип содержимого multipart form-data . Вот как я генерирую данные формы:

 const data = new FormData()
data.append(e.target.name, e.target.files[0])
  

но это может варьироваться в зависимости от пользовательского интерфейса.

tl; dr: мне нужно иметь возможность извлекать любой файл из request.files словаря, не зная имени, с которым файл был загружен.

Комментарии:

1. из пользовательского интерфейса вы можете запросить метаданные, например, что это за файл, или в заголовках вы можете найти, что это за файл. или сохранить см. Расширение файла, затем сохраните соответственно

2. Вы говорите, что print(f) это возвращает пустой dict, верно? Это странно, поскольку оно должно возвращать image , т.е. имя файла. Можете ли вы добавить выходные данные обоих print операторов?

3. ДА. У меня также был enumerate в моем цикле for, и я неправильно назвал аргументы цикла for (я думал, что первым будет элемент массива, за которым следует счетчик, но, по-видимому, все наоборот). Итак, я пытался получить запрос. файлы [1], запрос. файлы [2] вместо запроса. files[file1name], запрос. файлы [имя_файла2].

Ответ №1:

Вот фрагмент кода, чтобы увидеть соответствующие входные имена, указанные в HTML-файле.

 from flask import Flask, request, render_template

app = Flask(__name__)

@app.route("/",methods=['GET','POST'])
def home():
    if request.method == "POST":
        for i in request.files:
            print(i)
    return render_template("index.html")

if __name__ == "__main__":
    app.run(debug=True)
  

И вот файл шаблона (index.html )

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test App</title>
</head>
<body>
    
    <form action="/" method="POST" enctype='multipart/form-data'>
        <input name="unnamedfile1" type="file">
        <input name="unknownfile2" type="file">
        <input type="submit">
    </form>
</body>
</html>
  

Вот результат после отправки формы :
введите описание изображения здесь