3

我正在尝试将“文件”类型的表单字段传递给 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

1 回答 1

4

在您的第一个代码片段中,该值#FORM[fieldname]#计算为上传文件的名称。因此,您将文件名发送到您的函数,而不是包含文件名的字段的名称。

如果你想坚持你可以使用的结构符号

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

或者

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

反而。我也不认为您的(工作)第二个代码示例有什么问题。

编辑:

如果使用结构符号传递字段,似乎<cffile>无法评估文件字段,因为参数的一些自动评估魔法。经过一些进一步的调查,我发现只传递没有表单前缀的表单域的名称也可以。

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

filefield 参数记录为字符串,包含不带前缀的表单字段的名称。我的最后一种方法对我来说似乎更“正确”。它甚至会更多地隐藏实现。我也不太关心在组件或函数之外编写范围/结构变量/键,然后将其传递给函数。这最好在函数本身中完成。

于 2010-05-04T14:35:02.390 回答