Как запросить несколько аргументов из FormData?

Это дополнительный вопрос от здесь: там я научился загружать файл, обрабатывать его, а затем снова заполнять сайт его содержимым, используя AJAX и FormData. Например, если у меня есть такой файл data.csv:

A,B,C
1,3,4
2,4,2

Я могу передать это, используя AJAX и FormData

<form method="POST" enctype="multipart/form-data" id="fileUploadForm">
    <div class="custom-file">
       <input id="myfile" name="myfile" type="file" class="custom-file-input">

       <label for="myfile" class="custom-file-label">
         Choose file...
       </label>
    </div>
</form>

// the javascript part
var form = $('#fileUploadForm')[0];
var formdata = new FormData(form);

$.ajax({
        type: "POST",
        enctype: 'multipart/form-data',
        url: "/_get_table",
        data: formdata,
        processData: false,
                contentType: false,
                cache: false,
                timeout: 600000,

и получить:

введите здесь описание изображения

Затем я могу легко получить это, используя

file = request.files['myfile']

и преобразовать его в кадр данных, используя

df = pd.read_csv(file)

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

var formdata = new FormData();
formdata.append("myform", form)
formdata.append("myvalue", 10)

который дает

введите здесь описание изображения

и headers

введите здесь описание изображения

Как мне теперь правильно собирать информацию? Я могу получить myvalue вот так

val = request.form['myvalue']

но я не нашел способ получить доступ и прочитать myfile. Если я, например. пытаться

file = request.files['myform'] 

я получил

werkzeug.exceptions.HTTPException.wrap..newcls: 400 Неверный запрос: KeyError: 'myform'

Я также пробовал другие решения из здесь, но безуспешно.


person Cleb    schedule 03.10.2018    source источник
comment
Пожалуйста, покажите нам весь запрос, включая заголовки. И, кстати, это выглядит неправильно, так как вы не должны вставлять form в свой formdata, а только myfile. Ваша полезная нагрузка должна состоять из myfile и myvalue. Как вы можете видеть на вашем скриншоте. myform явно не файл, а объект javascript. Это бессмысленно.   -  person Sraw    schedule 03.10.2018
comment
@Sraw: Да, но я не знаю, как это правильно передать; Я не знаю, как только извлечь файл. Я также пробовал form.elements.myfile, но это тоже не помогает. Дайте мне секунду, чтобы сделать скриншоты...   -  person Cleb    schedule 03.10.2018
comment
@Срав; Добавил скриншот шапки. Это помогает?   -  person Cleb    schedule 03.10.2018
comment
Да, это помогает. Так что ваш формат правильный. Единственная проблема заключается в том, как правильно передать файл в javascript. В данном случае это не проблема python. Я думаю, вы можете напрямую var formdata = new FormData(form); formdata.append("myvalue", 10).   -  person Sraw    schedule 03.10.2018
comment
@Sraw: Кажется, это работает! Не стесняйтесь добавлять его в качестве ответа. Позже я открою еще один вопрос, чтобы действительно понять это поведение...   -  person Cleb    schedule 03.10.2018
comment
@Sraw: Не могли бы вы добавить свое решение в качестве ответа ?! Затем я проголосую и приму.   -  person Cleb    schedule 05.10.2018


Ответы (1)


Проблема в том, что вы неправильно добавили свой файл в FormData.

Поскольку вы используете multipart/form-data, ваша полезная нагрузка должна состоять из одного файла и нескольких form-data. Но на скриншоте, как видите, вы добавляли один object.

Чтобы решить эту проблему, на самом деле вы можете напрямую добавить свое значение к исходному FormData:

var formdata = new FormData(form); 
formdata.append("myvalue", 10);
person Sraw    schedule 05.10.2018