为什么FORM范围显示的值少于此AJAX文件上传器实际提交的值?

时间:2019-03-12 22:30:22

标签: coldfusion coldfusion-11

我不确定我是否可以表达我的问题,但是我相信它是特定于ColdFusion对某些AJAX表单数据的处理,尽管我引用了特定的JavaScript插件。

我正在尝试在ColdFusion 2011服务器上实现FilePond uploader,并且已经在前端进行了很好的配置(将文件上传到tmp文件夹就很好了),但是我的问题不知道如何使ColdFusion处理在每次上载时随其发送的额外元数据。在我看来,这些数据看起来不像普通的旧隐藏输入字段一样。

当我使用开发工具检查网络请求时,对我来说,它看起来与我处理过的其他表单不同。有两个“ filepond”条目,一个是JSON对象,另一个是二进制图像。当我时,我只能得到tmp上传的文件路径,可以处理。但是,如何在包含“父代”的屏幕快照中访问JSON?我没有尝试过像form.FilePond [1]一样有效,并且会引发错误。

I want to get ColdFusion to process the "parentid" value

使用CF表单处理页面的输出进行更新:

第一行是Form.FilePond的输出。

2nd是表格的cfdump。

第3个是cfdump URL。

第4个是getHttpRequestData()的cfdump

1 个答案:

答案 0 :(得分:1)

更新

CF2016提交的错误(CF11的核心支持在2019年4月之后终止)

  • CF-4204103- 当相同的命名字段包括FORM时,type=file范围缺少值
  • CF-4204102-sameFormFieldAsArray设置不适用于enctype="multipart/form-data"

经过一些测试,我认为这是ColdFusion错误。

问题:

在这种情况下似乎出现了问题

  • 请求是multipart/form-data帖子
  • 包含多个具有相同名称
  • 的字段
  • 这些字段中至少有一个是文件字段,即type="file"
  • (组内)提交的第一个字段是不是文件字段

在这种情况下,ColdFusion似乎忽略了第一个文件字段之前的所有内容。 (如果您检查filepond source ut确认元数据字段在所有文件字段之前 提交)。这就是为什么在转储FORM范围时不显示元数据值的原因。

请注意,this.sameFormFieldsAsArray设置无效,因为它不适用于multipart/form-data请求。

测试用例

下面是一个测试用例。注意,在第一个文件字段之后 出现相同的命名字段时,结果是您期望的结果?

Screenshot of Test Case

<cfdump var="#form#" label="Form scope">

<form method="post" enctype="multipart/form-data">
    <br>First:
    <input type="file" name="fileFirst"><br>
    <input type="text" name="fileFirst" value="Lions"><br>

    <br>Last:
    <input type="text" name="fileLast" value="Tigers"><br>
    <input type="file" name="fileLast"><br>

    <br>Middle:
    <input type="text" name="fileMiddle" value="Bears"><br>
    <input type="file" name="fileMiddle"><br>
    <input type="text" name="fileMiddle" value="Oh My"><br>

    <input type="submit">
</form>

解决方法

This blog提供了使用FORM范围的未记录功能的解决方法。使用form.getPartsArray()可以访问两个“ filePond”字段,从而使您可以提取放置的字段的值。这不是理想的方法,但是可以解决问题。

请记住,这是一个未记录的功能,因此请确保隔离代码以便更轻松地进行更改,以防Adobe将来更改或删除该功能(这是他们之前所做的,非常警告!)。

<cfscript>
    // dump raw form fields 
    for (part in form.getPartsArray()) {
        writeDump({ fieldName = part.getName()
                    , isFile  = part.isFile()
                    , fieldValue = (part.isFile() ? part.getFileName() : part.getStringValue())
                }
        );
    }
</cfscript>