我快要疯了,试图找到解决这个问题的方法。
这是代码:
<!--- 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:InetpubvhostsMyDomaincalendar
path C:InetpubvhostsMyDomaincalendarJanuary_2019_page_1.png
size 501168
type file
fileName: January_2019_page_1.png
newFileName: January_2019.png
fullNewFilePath: C:InetpubvhostsMyDomaincalendarJanuary_2019.png
Error occured....
Message: Attribute validation error for tag CFFILE.
Detail: The value of the attribute source, which is currently C:InetpubvhostsMyDomaincalendarJanuary_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>
我知道有几种可能性,该错误可能会产生误导:
1( 在某些版本的 CF 中,存在一个错误,当真正的原因是目标属性的错误时,cffile 报告了源属性的错误 - 例如缺少目录或文件名冲突或缺少对目标的权限。听起来你已经排除了其中的大部分。
2( 在某些情况下,Coldfusion Service 用户需要对源目录的"修改"权限才能执行重命名操作,即使它已经具有读取 + 执行 + 写入,如果没有它,结果就是这条神秘的消息。如果是这种情况,那么您应该能够通过将文件复制到其他目录而不是在同一目录中重命名来证明这一点。
3( 我之前见过由于服务器进程监视某些目录的更改而导致文件句柄锁定的问题 - 包括但不限于 AV/恶意软件扫描程序、自动备份/robocopy 脚本以及将文件传播到集群中的其他节点。这可能会导致在上传文件并释放锁定后的几秒钟内无法修改或重命名文件 - 如果是这种情况并且服务器管理员不受您的控制,那么您应该能够使用 try/catch + 循环重试 n 次, 每次迭代都需要短暂的等待 - 例如sleep(5000)
.