代码之家  ›  专栏  ›  技术社区  ›  Eric Belair

为什么不能使用结构语法将类型为file的表单字段传递给cffunction?

  •  3
  • Eric Belair  · 技术社区  · 15 年前

    我正在尝试将“file”类型的表单字段传递给cffunction。参数类型为“any”。下面是我要使用的语法(伪代码):

    <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 回复  |  直到 15 年前
        1
  •  4
  •   Andreas Schuldhaus    15 年前

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

    如果您想坚持使用结构符号,可以使用

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

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

    相反。我也认为您的(正在工作的)第二个代码示例没有任何问题。

    编辑:

    好像 <cffile> 如果使用结构表示法传递字段,则无法计算FileField,因为参数具有某种自动计算的魔力。经过进一步的调查,我发现只传递没有表单前缀的表单域的名称也可以。

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

    fileField参数以字符串形式记录,其中包含不带前缀的FormField的名称。我的最后一个方法对我来说更“正确”。它甚至会隐藏更多的实现。我也不太关心在组件或函数外部组合作用域/结构var/键,然后将其传递给函数。这最好在函数本身中完成。