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」などの 5 つのフォーム フィールドがあるため、ループが実行されています。

これにより、関数で例外がスローされます。

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>

2 番目の例のようなコードを書くのは好きではありません。それは私には悪い習慣のように思えます。

では、構造構文を使用してファイル タイプ フォーム フィールドを CFFUNCTION に適切に渡す方法を誰か教えてもらえますか??

4

1 に答える 1

4

最初のコードスニペットでは、値#FORM[fieldname]#はアップロードされたファイルの名前に評価されます。したがって、ファイル名を含むフィールドの名前ではなく、ファイル名を関数に送信します。

構造表記を使い続けたい場合は、

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

また

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

代わりは。また、(動作している)2番目のコード例に問題はないと思います。

編集:

<cffile>パラメータの自動評価の魔法のために、構造体表記を使用してフィールドを渡すと、ファイルフィールドを評価できないように見えます。さらに調査した結果、フォームプレフィックスなしでフォームフィールドの名前のみを渡すことも機能することがわかりました。

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

filefieldパラメータは、プレフィックスなしのフォームフィールドの名前を含む文字列として文書化されています。私の最後のアプローチは、私にはもっと「正しい」ように思えます。それは実装をもう少し隠すでしょう。また、コンポーネントまたは関数の外部でscope / struct var / keysを作成し、それを関数に渡すことについてもあまり関心がありません。これは、関数自体で行う方がよいでしょう。

于 2010-05-04T14:35:02.390 に答える