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