Почему я не могу передать поле формы типа file в CFFUNCTION, используя синтаксис структуры?

Я пытаюсь передать поле формы типа "файл" в CFFUNCTION. Тип аргумента "любой". Вот синтаксис, который я пытаюсь использовать (псевдокод):

<cfloop from="1" to="5" index="i">
    <cfset fieldname = "attachment" & i />

    <cfinvoke component="myComponent" method="attachFile">
        <cfinvokeargument name="attachment" value="#FORM[fieldname]#" />
    </cfinvoke>
</cfloop>

Цикл выполняется потому, что есть пять полей формы с именами "attachment1", "attachment2" и др.

Это вызывает исключение в функции:

coldfusion.tagext.io.FileTag$FormFileNotFoundException: The form field C:\ColdFusion8\...\neotmp25080.tmp did not contain a file.

Тем не менее, этот синтаксис работает:

<cfloop from="1" to="5" index="i">
    <cfinvoke component="myComponent" method="attachFile">
        <cfinvokeargument name="attachment" value="FORM.attachment#i#" />
    </cfinvoke>
</cfloop>

Мне не нравится писать такой код во втором примере. Это просто кажется плохой практикой для меня.

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

1 ответ

Решение

В твоем первом кодснипете значение #FORM[fieldname]# оценивает имя загруженного файла. Таким образом, вы отправляете имя файла вашей функции вместо имени поля, содержащего имя файла.

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

<cfinvokeargument name="attachment" value="FORM['#fieldname#']" />

или же

<cfinvokeargument name="attachment" value="FORM.#fieldname#" />

вместо. Я также не думаю, что с вашим (рабочим) вторым примером кода что-то не так.

Редактировать:

Кажется как будто <cffile> не может оценить файловое поле, если вы передаете поле, используя нотацию struct, из-за некоторого волшебства автоматической оценки параметра. После некоторых дальнейших исследований я обнаружил, что передача только имени поля формы без префикса формы также будет работать.

<cfinvokeargument name="attachment" value="#fieldname#" />

Параметр filefield документируется как строка, содержащая имя поля формы без префикса. Мой последний подход кажется мне более "правильным". Это даже скрыло бы реализацию немного больше. Я также не так много о создании области видимости / структуры var/keys вне компонента или функции, а затем о передаче его в функцию. Это лучше сделать в самой функции.

Другие вопросы по тегам