Почему я не могу передать поле формы типа 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 вне компонента или функции, а затем о передаче его в функцию. Это лучше сделать в самой функции.