ColdFusion:如何获取失败的上传文件名

时间:2019-05-03 18:53:22

标签: coldfusion coldfusion-11 cffile

我正在尝试将失败上传的文件名放入try / catch中的电子邮件中,但是我没有任何运气。

基于此文档-FileUploadAll()-我决定要使用错误。

<cftry>
    <cffile destination="#FULLPATH#" action="upload" nameconflict="ERROR" continueOnError="true" filefield="FileName" />
    <cfcatch type="Any" >
        <cf_EmailHandler from="testmail@gmail.com" to="testmail@gmail.com" subject="Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#">
            <CFOUTPUT>
                Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#
                Cannot upload the following file:
                #FULLPATH# #ArrayLen(cffile.uploadAllErrors)#
            </CFOUTPUT>
        </cf_EmailHandler>
        <b>Error:</b>File already exists.
        <cfabort>
    </cfcatch>
</cftry>

我收到以下错误:

  

元素UPLOADALLERRORS在CFFILE中未定义

所以我尝试解决该问题:

<cftry>
    <cffile destination="#FULLPATH#" action="upload" nameconflict="ERROR" Errors="errorResult" continueOnError="true" filefield="FileName" />
    <cfcatch type="Any" >
        <cf_EmailHandler from="testmail@gmail.com" to="testmail@gmail.com" subject="Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#">
            <CFOUTPUT>
                Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#
                Cannot upload the following file:
                #FULLPATH# #ArrayLen(errorResult.uploadAllErrors)#
            </CFOUTPUT>
        </cf_EmailHandler>
        <b>Error:</b>File already exists.
        <cfabort>
    </cfcatch>
</cftry>

然后我得到:

  

在ERRORRESULT中未定义元素UPLOADALLERRORS。

关于我做错了什么还是显示失败的上传名称的任何想法?我也在使用ColdFusion11。

2 个答案:

答案 0 :(得分:1)

更新

错误报告CF-4204290当前将此问题列为“要修复”。

TL; DR;

这是一个文档错误。 action=upload不支持continueOnError属性。请改用action=uploadAll。请记住,“ uploadAll”支持多个文件,因此结果将作为结构的 array 返回。


它不起作用的原因是因为代码使用了错误的“动作”。它应该是 action =“ uploadAll” 。由于您使用的是continueOnError="true",因此CF会在结构中填充发生的任何错误。默认情况下,它使用CFFILE,但是您可以使用errors属性指定其他变量名。

<cffile destination="c:/some/path/" 
    action="uploadAll" 
    nameconflict="ERROR" 
    continueOnError="true" 
    filefield="file_path" />

更新

如评论中所指出,文档{em>确实说continueOnErroraction=upload的受支持属性。但是,IMO是一个文档错误。 Adobe可能只是从action = uploadAll描述中复制了文本。

有趣的是,FileUpload()的文档根本没有列出该属性。 Bug report CF-4199503确认该功能版本不支持该功能。根据下面在CF11和CF2016上进行的测试,我得出结论说两个版本都不支持它。


测试操作=全部上传

上传目标目录中已经存在的文件,不会导致硬错误。 CF使用错误详细信息填充指定的变量,并将其转储到屏幕上:

<cfif structKeyExists(FORM, "submit")>
    <cffile destination="c:/temp" 
        action="uploadAll" 
        nameconflict="ERROR" 
        continueOnError="true" 
        errors="myErrors"
        filefield="file_path" />

    <cfdump var="#cffile#" label="cffile">
    <cfdump var="#myErrors#" label="errors">
</cfif>

<form  method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file_path">
    <input type="submit" name="test">
</form>

结果: Screenshot of Action UploadAll results

测试操作=上传

将操作更改为action="upload",代码将失败。 ColdFusion不会:

  • 错误后继续处理..或
  • 使用错误信息填充cffile ...或
  • 创建一个由errors属性命名的结果变量

结果:

Screenshot of Action Upload Results

注意,省略可选的errors属性会产生相同的结果。使用action = uploadAll时,它按预期工作,而使用action = upload

时,失败并显示错误

答案 1 :(得分:0)

在表单页面中,我使用JavaScript捕获了文件名

<Input Name="FileName" type="file" size="#TEXT_AREA_WIDTH#"><br><br>
<Input type="Hidden" id="READ_FILE_NAME" name="READ_FILE_NAME" value="">
<Input type="Submit" name="Operation" value="Save" onclick="return validateAttachmentForm(this.form.FileName.value)">&nbsp;

function validateAttachmentForm(file_name)
{
  if (file_name.lastIndexOf("\\" != -1)) {
    var file_name = file_name.substring(file_name.lastIndexOf("\\") + 1, file_name.length);
  }

  document.getElementById("READ_FILE_NAME").value = file_name;

  if(file_name != "")
  {
    return true;
  } else{

    alert('Please select a file to upload.')
    return false;
  } 
}

在下一页中,我只显示传入的filname

<cftry>
    <cffile destination="#FULLPATH#" action="upload" nameconflict="ERROR" Errors="errorResult" continueOnError="true" filefield="FileName" />
    <cfcatch type="Any" >
        <cf_EmailHandler from="testmail@gmail.com" to="testmail@gmail.com" subject="Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#">
            <CFOUTPUT>
                Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#
                Cannot upload the following file:
                #FULLPATH#\#form.READ_FILE_NAME#
            </CFOUTPUT>
        </cf_EmailHandler>
        <b>Error:</b>File already exists.
        <cfabort>
    </cfcatch>
</cftry>