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

ColdFusion CFFILE rename Attribute Validation Error, The value of the attribute source is invalid, even though File Exists and Paths are correct

我正在疯狂地寻找这个问题的解决方案。

代码如下:

<!--- 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",它在页面前面执行时没有问题。此外,如果在单独的页面上完成此代码 运行 会很好,而不是在此页面上(我需要它 运行 )。

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

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

~~珍妮弗~~

* 已更新以显示最终有效的内容:*

<!--- 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>

我知道有几种可能会误导错误的地方:

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

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

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