2010-05-04 2 views
3

Я пытаюсь передать поле формы типа «файл» в CFFUNCTION. Тип аргумента - «any». Вот синтаксис Я пытаюсь использовать (псевдокод):Почему я не могу передать поле формы файла типа 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?

ответ

4

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

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

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

или

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

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

Edit:

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

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

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

+0

не работает ... –

+0

работает, но все еще не оптимален. Благодарю. –

+0

Да, это странно. Но поскольку cffile action = "upload" ожидает строку "name" поля формы, я не уверен, как еще вы могли ее написать. – Leigh