Почему область видимости FORM отображает меньше значений, чем было фактически отправлено этим загрузчиком файлов AJAX? - PullRequest
3 голосов
/ 13 марта 2019

Я не уверен, что понимаю, как сформулировать свой вопрос, но я считаю, что он специфичен для обработки ColdFusion определенных данных формы AJAX, несмотря на мою ссылку на конкретный плагин JavaScript.

Я пытаюсь реализовать FilePond Uploader на сервере ColdFusion 2011, и я настроил его хорошо на внешнем интерфейсе (он прекрасно загружает файлы в папку tmp), но моя проблема не знает, как заставить ColdFusion обрабатывать дополнительные метаданные, которые он отправляет вместе с ним при каждой загрузке. Эти данные не выглядят мне так, как будто бы они имеют тот же формат, что и обычные скрытые поля ввода.

Когда я проверяю сетевой запрос с помощью Dev Tools, он выглядит для меня иначе, чем другие формы, которые я обработал. Есть две записи «filepond», одна - объект JSON, а другая - двоичное изображение. Когда я , я получаю только путь к загруженному файлу tmp, который я могу обработать. Но как мне получить доступ к JSON на моем скриншоте с парентидом? Ничего из того, что я пробовал, например form.FilePond [1], похоже, работает и выдает ошибки.

I want to get ColdFusion to process the

Обновление с выводом со страницы обработки формы CF:

1-я строка выводит Form.FilePond.

2-й - это cfdump формы.

3-й - это URL-адрес cfdump.

4-е - это cfdump getHttpRequestData ()

1 Ответ

1 голос
/ 14 марта 2019

Обновление:

Ошибки, поданные для CF2016 (поддержка ядра заканчивается для CF11 после апреля 2019 года)

  • CF-4204103 -FORM в области видимости отсутствуют значения, если поля с одинаковыми именами включают type=file
  • CF-4204102 - sameFormFieldAsArray Настройка не работает с enctype="multipart/form-data"

После некоторого тестирования я пришел к выводу, что это ошибка ColdFusion.

Проблема:

Эта проблема возникает при таких условиях

  • Запросявляется multipart/form-data POST
  • Содержит несколько полей с одинаковым именем
  • Как минимум 1 из этих полей является полем файла, т.е. type="file"
  • Первое отправленное поле (внутри группы): NOT поле файла

В этих условиях ColdFusion, похоже, игнорирует все до поля первого файла ,(Если вы проверите sourcepond file ut, подтвердите, что поле метаданных отправлено до любых полей файла).Вот почему значение метаданных не появляется при выводе области видимости FORM.

Обратите внимание, настройка this.sameFormFieldsAsArray не действует, поскольку она не работает с multipart/form-data запросами.

Тестовый набор

Ниже приведен тестовый пример.Обратите внимание на результаты, которые вы ожидаете, когда то же именованное поле появляется после первого поля файла?

Screenshot of Test Case

<cfdump var="#form#" label="Form scope">

<form method="post" enctype="multipart/form-data">
    <br>First:
    <input type="file" name="fileFirst"><br>
    <input type="text" name="fileFirst" value="Lions"><br>

    <br>Last:
    <input type="text" name="fileLast" value="Tigers"><br>
    <input type="file" name="fileLast"><br>

    <br>Middle:
    <input type="text" name="fileMiddle" value="Bears"><br>
    <input type="file" name="fileMiddle"><br>
    <input type="text" name="fileMiddle" value="Oh My"><br>

    <input type="submit">
</form>

Обходное решение

Этот блог предоставляет обходной путь с использованием недокументированной функции области FORM,Использование form.getPartsArray() обеспечивает доступ к обоим полям "filePond", позволяя вам извлечь значение пропущенного поля.Не идеально, но работает до тех пор, пока проблема не будет устранена.

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

<cfscript>
    // dump raw form fields 
    for (part in form.getPartsArray()) {
        writeDump({ fieldName = part.getName()
                    , isFile  = part.isFile()
                    , fieldValue = (part.isFile() ? part.getFileName() : part.getStringValue())
                }
        );
    }
</cfscript>
...