Как обрабатывать несколько загрузок файлов, когда имя и количество входов являются динамическими?

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

Однако они следуют этому соглашению об именах:

<input name = "image_path" ...
<input name = "image_path_F1" ...
<input name = "image_path_F2" ...
<input name = "image_path_F3" ...

Входные данные отправляются как объекты FormData.

При обработке одного изображения из сценариев Python, которые я ранее использовал:

uploaded_image = request.files.name_of_file_input_here

Вопрос

Существует ли общий метод "поймать все", доступный с request.files, который можно использовать, например:

uploaded_images = request.files.*all

Или мне нужно будет создать какой-то цикл для обработки возможных имен файлов, например:

Клиентская сторона (jQuery)

var names_array = ["image_path","image_path_F1","image_path_F2"];
var length_of_names_array = 3;

отправил на питон...

Питон

names_array = request.forms.names_array
length_of_names_array = request.forms.length_of_names_array

counter = 1
for i, val in enumerate(range(length_of_names_array)):
    if i == 0:
        constructor = "image_path"
        request.files.constructor
    else:
        constructor = "image_path_F" + str(counter)
        request.files.constructor
        counter += 1

Приведенный выше код просто сгенерирует правильные имена (и на самом деле я не уверен, что описанный выше метод request.files будет работать с constructor - edit, похоже, не работает).

Здесь может быть решение, которое можно найти в подходе:

https://stackoverflow.com/a/3111795/1063287

Но я не совсем понимаю, как это работает или как именно это можно применить к приведенному выше сценарию:

Если вы не знаете ключ, вы можете перебрать файлы:

for filename, file in request.FILES.iteritems():
    name = request.FILES[filename].name

person user1063287    schedule 21.02.2014    source источник
comment
У вас есть контроль над именованием входных данных формы? Думаю, это упростило бы решение.   -  person nthall    schedule 21.02.2014
comment
Они имеют динамические имена в соответствии с соглашением, показанным выше, поскольку существует динамическое количество входов. Должен быть способ сделать это, просто мне нужно время, чтобы понять, как — то есть, как определить каждый ввод в скрипте Python, чтобы я мог поместить каждый файл в базу данных.   -  person user1063287    schedule 21.02.2014
comment
Вы контролируете или не контролируете схему динамического именования этих входов?   -  person nthall    schedule 21.02.2014


Ответы (1)


Это кажется немного изворотливым, потому что я еще не совсем уверен, как это работает, но это работает.

Это реализация Mongo, однако я добавляю ее здесь, потому что считаю, что вывод заключается в том, что вы можете определить и получить доступ к нескольким входным файлам, где name является динамическим объектом, как и количество входных данных.

Это позволило использовать iteritems().

Питон

for key, value in request.files.iteritems():
    uploaded_image = request.files[key]
    name, ext = os.path.splitext(uploaded_image.filename)
    if ext not in ('.png','.jpg','.jpeg','.JPG','.gif'):
        return "File extension not allowed."
    if uploaded_image and uploaded_image.file:
        raw = uploaded_image.file.read()
        filename = uploaded_image.filename
        dbname = 'grid_files'
        db = connection[dbname]
        fs = gridfs.GridFS(db)
        fs.put(raw,filename=filename, user_email = user_email)

Это добавляет каждое изображение в базу данных с именем файла и электронной почтой пользователя для уникальной идентификации (а также поля времени и длины, автоматически генерируемые MongoDB).

На стороне клиента входные данные добавлялись к FormData. объект с:

JQuery

var image_inputs = $("#my_form input[type=file]");
$.each(image_inputs,function(obj,v) { 
var file = v.files[0];
var filename = $(v).attr("data-img_filename");
var name = $(v).attr("id");
myFormData.append(name, file, filename);
});

И кажется, что имя файла автоматически включается без необходимости определять его, как указано выше:

https://stackoverflow.com/a/21942376/1063287

person user1063287    schedule 21.02.2014