如何正确使用 Coldfusion File Exist() 方法?
Posted
技术标签:
【中文标题】如何正确使用 Coldfusion File Exist() 方法?【英文标题】:How to properly use Coldfusion's FileExist() method? 【发布时间】:2012-05-10 11:46:39 【问题描述】:我根本不怎么使用coldfusion,不过我需要修补一些代码。基本上我正在尝试检查我上传的文件是否存在,如果确实存在,则将变量增加 1。然后重复直到我得到一个唯一的文件名。无论出于何种原因,我都想不出使用 FileExist() 的正确方法。一些论坛建议将它与 len() 一起使用,但那些是从 2006 年开始的,当我这样做时,它似乎总是正确的。此外,当我查看http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7c66.html 时,它说它返回是或否。我尝试以各种方式检查结果,但没有运气。
这是我正在处理的代码部分。 application.filepath 只是我的应用程序文件中的一个变量,它存储了 expandpath()。
<cffile action="upload" destination="#Application.filePath#ListingsGallery/" filefield="iconImage" nameconflict="makeunique">
<cfset iconPlace = #cffile.serverfile#>
<cfset myExt = listLast(iconPlace,".")>
<cfset i = 1 >
<cfset myVar = false>
<cfloop condition="myVar EQ false">
<cfset newIconName = "iconPhoto" & i &"."& myExt>
<cfset iconName = Application.filePath & "ListingsGallery/" & #newIconName#>
<cfoutput>#iconName#</cfoutput><br />//just checking to see if it is the correct path, it is.
<cfif FileExists(iconName) EQ 'Yes'>
<cfoutput>#myVar#</cfoutput> //checking the value, it never hits here.
<cfelse>
<cfoutput>#myVar#</cfoutput><br /> //checking the value, it always hits here.
<cfset myVar = true>
<cfoutput>#myVar#</cfoutput> //Again check the value.
</cfif>
<cfset i++>
</cfloop>
<cffile action="rename" source="#Application.filePath#ListingsGallery/#iconPlace#" destination="#Application.filePath#ListingsGallery/#newIconName#">
unix 服务器上的绝对路径类似于 /var/www/website 文件夹名称/ 等.... 正确的?那是绝对服务器路径,coldfusion 文档似乎至少指定了一个微软绝对服务器路径,所以我假设这是需要的。
编辑--------------- PS:我只能给你们一个信用,所以我把它给了克鲁格,因为他一分钟前来了。 哈哈……
【问题讨论】:
iconName 是什么样的?我看到您正在输出它进行测试,这很好。至于路径,我推荐使用 /。它适用于 Windows + Linux/OSX 系统。<cfif FileExists(iconName) EQ 'Yes'>
是一个字符串比较。你可能应该只做<cfif FileExists(iconName)>
,因为 FileExists 返回一个布尔值。
【参考方案1】:
FileExists() 返回一个布尔值。既然错字已被修复,这应该可以正常工作:
<cfif fileExists(TheFile)>
// do this
<cfelse>
// do that
</cfif>
【讨论】:
这有效,尽管coldfusion文档说它返回“是”或“否”,但没有提及布尔值或真/假状态。 help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/… 我理解是/否开/关,但我从未见过这样说,所以我认为他们的意思是字面意思“是”或“否”。谢谢大家的帮助。 CF 代码中有几个地方只有 true/false 起作用。这只是一个小错误,文档中有一些错误。我很高兴能帮上忙。 @Evik - 可能有一些特殊情况(我无法回忆),但我很确定这不是其中之一:) 任何一种语法都应该有效。这只是风格问题。虽然我更喜欢你的。 @Mike - 哦,我们为向后兼容所做的事情 ;) 错字,存在不存在。【参考方案2】:拥有后端安全性很棒,但这应该在前端处理,因此您永远不会得到您不想要的值。新的 HTML5 输入模式将阻止此问题被提交,因此您不必在后端解决此问题。
http://www.w3schools.com/tags/att_input_pattern.asp
【讨论】:
我认为您误解了这个问题。他们询问重命名 服务器端 文件。不是客户端代码可以完成的事情。 html5 输入模式不应用于安全性。还有其他方法可以绕过浏览器向服务器抛出数据。【参考方案3】:我还不能为答案添加注释,但我想让 OP 知道 CF 在函数中的布尔评估时是无类型的。 0 同“no”同“false”,而任何正数同“yes”同“true”。
【讨论】:
是的。虽然负数也等同于true
。
你去 - 你已经超过了愚蠢的 50 代表限制,所以现在可以发布 cmets。 :)
我会给你一个额外的投票 sharondio... 只是这样你就可以制作 cmets :)
或者只是为了不让我发布真正的 cmets 答案? :-) 谢谢各位!【参考方案4】:
假设您的 application.Filepath 是正确的文件路径,您就在正确的轨道上。看起来您的上传目录可能位于 Web 根目录下 - 考虑将其移出 Web 根目录以确保安全。看看#expandPath('.')# 作为一种创建没有错别字的有保证的文件路径的方法:) 也使你的代码更便携。
在我看来,上面的代码可以工作。仅供参考 - 你不需要“EQ 'YES'。你可以这样做:
<Cfif FileExists(iconName)>...
你也可以
condition="NOT myVar">
在 CF 中有几种处理逻辑代码的方法。
如果您的 fileExists() 从未命中,请仔细查看您的重命名。你在抛出错误吗?
【讨论】:
嘿....请注意 - 您的代码有些多余..文件上传的“makeunique”属性将保证唯一性... 是的,但我遇到的问题导致我承担这与人们上传带空格的图像有关。它们在数据库中变成 %20,但在服务器上仍然是一个空间。所以图像永远不会出现,也不能根据数据库条目删除。我想我可以做某种 str_replace 但如果我可以在这里剪掉它,我宁愿不必检查和修改对这些图像的每一个引用。 那么我会说你是在正确的轨道上......我自己写过一些这样的代码:)以上是关于如何正确使用 Coldfusion File Exist() 方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 file_put_contents() 与 FILE_APPEND | 一起使用LOCK_EX 安全吗?