ColdFusion CFFILE 重命名属性验证错误,属性源的值无效,即使文件存在且路径正确

Posted

技术标签:

【中文标题】ColdFusion CFFILE 重命名属性验证错误,属性源的值无效,即使文件存在且路径正确【英文标题】:ColdFusion CFFILE rename Attribute Validation Error, The value of the attribute source is invalid, even though File Exists and Paths are correct 【发布时间】:2020-05-15 16:50:12 【问题描述】:

我正在为这个问题寻找解决方案而发疯。

代码如下:

<!--- Rename PNG File to remove _page_1.png --->
<cfset fileOnServer = "#RootDirectory#\calendar\#uploadedImage#">
<cfif FileExists("#fileOnServer#")>
  FileExists<br>
  <cfset test = GetFileInfo("#fileOnServer#")>
  <cfdump var="#test#">
  <cfset fileName = "#test.name#">
  <cfset newFileName = #Replace(fileName,'_page_1','')#>
  <cfset fullNewFilePath = "#RootDirectory#\calendar\#newFileName#">
  <cfoutput>fileName: #fileName#<br>newFileName: #newFileName#<br>fullNewFilePath: #fullNewFilePath#<br></cfoutput>
  <cftry>
    <cffile action="rename" destination="#fullNewFilePath#" source="#fileOnServer#" attributes="normal" nameconflict="overwrite">
    <cfcatch>
      <cfoutput>
        <div style="text-align: left;">
          Error occured....<br /><br />
          Message: <b>#cfcatch.Message#</b><br /> 
          Detail: <b>#cfcatch.Detail#</b><br />
          Type: <b>#cfcatch.Type#</b><br />
        </div>
      </cfoutput>
      <cfset ErrorOccurred = "Y">
    </cfcatch>
  </cftry>
</cfif>

当它运行时,结果如下:

FileExists
struct
canRead YES
canWrite    YES
isHidden    NO
lastmodified    ts '2020-05-15 09:36:39'
name    January_2019_page_1.png
parent  C:\Inetpub\vhosts\MyDomain\calendar
path    C:\Inetpub\vhosts\MyDomain\calendar\January_2019_page_1.png
size    501168
type    file
fileName: January_2019_page_1.png
newFileName: January_2019.png
fullNewFilePath: C:\Inetpub\vhosts\MyDomain\calendar\January_2019.png
Error occured....

Message: Attribute validation error for tag CFFILE.
Detail: The value of the attribute source, which is currently C:\Inetpub\vhosts\MyDomain\calendar\January_2019_page_1.png, is invalid.
Type: Application

我有另一个 cffile action="rename" 在页面前面执行时没有问题。此外,如果在单独的页面上完成此代码将运行良好,而不是在此页面上(我需要它运行的地方)。

我的主机在 Windows 上运行 ColdFusion 10,如果有帮助的话。

感谢任何可以帮助解决此问题的人!

~~詹妮弗~~

* 已更新以显示最终效果:*

<!--- Rename PNG File to remove _page_1.png --->
<cfset fileOnServer = "#RootDirectory#\calendar\#uploadedImage#">
<cfif FileExists("#fileOnServer#")>
    <cfset RETRY_COUNT_MAX=10>
    <cfset RETRY_SLEEP_MS=5000>
    <cfloop index="retryCount" from="1" to="#RETRY_COUNT_MAX#">
        <cftry>
        <!--- Trying to repeat this code until it works --->                    
        <cfset myFile = GetFileInfo("#fileOnServer#")>
        <cfset fileName = "#myFile.name#">
        <cfset newFileName = #Replace(fileName,'_page_1','')#>
        <cfset fullNewFilePath = "#RootDirectory#\calendar\#newFileName#">
        <cffile action="rename" destination="#fullNewFilePath#" source="#fileOnServer#" attributes="normal" nameconflict="overwrite">
        <cfbreak>
        <cfcatch>
            <cfif retryCount GTE RETRY_COUNT_MAX><cfrethrow></cfif>
            <cfthread action="sleep" duration="#RETRY_SLEEP_MS#" />
        </cfcatch>
        </cftry>
    </cfloop>
</cfif>

【问题讨论】:

文件操作的错误消息在 CF 中经常会产生误导(Java 中的广泛异常并不完全有帮助)。尝试重命名/移动源文件时,很可能您的源文件仍处于锁定状态。或者目标文件已经存在。或者你的磁盘已满。通过复制源文件而不是重命名/移动它来开始调试,看看会发生什么。如果您可以将其缩小到文件锁,那么真正的乐趣就开始了。锁的原因是什么?一个打开的文件句柄?可能是另一个线程?您可能希望在尝试重命名之前共享您运行的代码(源文件来自哪里?)。 尝试使用 cflock 将每个代码处理与文件(读取/重命名)等结合起来。 页面上有其他代码吗?此代码是否恰好存在于可能存在其他冲突变量的循环或 cfc 中?转储 cfcatch,因为可能有有用的信息。 我尝试使用包含在 cflock 标记中的 cffile 标记运行代码并得到相同的错误。我试过复制(而不是重命名)文件——同样的错误。如果目标文件存在,我已经启用了覆盖,所以这不重要,不是吗?此外,该文件需要存在才能重命名,对吗?此代码不在循环或 cfc 中。我无法转储 cfcatch,因为我的主机禁用了该功能。我在想文件锁可能是问题所在,但真的不知道如何解决这个问题。我会继续努力... 文件可能已损坏。您可以在同一源路径中尝试不同的文件吗?文件夹本身是否有权让 ColdFusion 访问它? 【参考方案1】:

我知道该错误可能会误导以下几种可能性:

1) 在某些版本的 CF 中,当真正的原因是目标属性错误时,cffile 会报告源属性错误 - 例如缺少目录或文件名冲突或目标权限不足.听起来您已经排除了其中的大部分。

2) 在某些情况下,Coldfusion 服务用户需要对源目录具有“修改”权限才能进行重命名操作,即使它已经具有读取 + 执行 + 写入功能,如果没有它,结果就是这条神秘消息。如果是这种情况,那么您应该能够通过将文件复制到不同的目录而不是在同一目录中重命名来证明这一点。

3) 我之前曾见过文件句柄锁定问题,因为服务器进程监视某些目录的更改 - 包括但不限于 AV/恶意软件扫描程序、自动备份/robocopy 脚本以及将文件传播到集群中的其他节点.这可能会导致文件上传后几秒钟内无法修改或重命名文件并且锁定已被释放 - 如果是这种情况并且服务器管理员不在您的控制范围内,那么您应该能够解决它使用 try/catch + 循环重试 n 次,每次迭代都会短暂等待 - 例如 sleep(5000)

【讨论】:

我将尝试您的建议 #3,看看是否可行。 添加 try/catch + 循环就可以了!我首先尝试使用 3000 的睡眠值,但它仍然给出了错误。我将其更改为 5000 并且有效!谢谢!!!

以上是关于ColdFusion CFFILE 重命名属性验证错误,属性源的值无效,即使文件存在且路径正确的主要内容,如果未能解决你的问题,请参考以下文章

ColdFusion 301重定向

Coldfusion框架应用程序配置

您如何在 ColdFusion 中重定向并控制状态码(即 301 而不是 302)

在 laravel 中重命名验证响应

将 HTTP 重定向到 HTTPS 在基本身份验证中的关键作用是啥?

Coldfusion电子邮件验证