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

Я пытаюсь передать поле формы типа "файл" в 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 Ответ

4 голосов
/ 04 мая 2010

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

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

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

или

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

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

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

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

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

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

...