coldfusion cffile删除问题
我有一个页面,用户可以用4个图像和一些其他字段更新页面。已经有一个图像上传的每个文件输入,当他们上传一个新的我想采取新的图像,上传它,然后如果上传成功删除旧的图像。然而,我得到了这个错误coldfusion cffile删除问题,coldfusion,upload,delete-file,cffile,Coldfusion,Upload,Delete File,Cffile,我有一个页面,用户可以用4个图像和一些其他字段更新页面。已经有一个图像上传的每个文件输入,当他们上传一个新的我想采取新的图像,上传它,然后如果上传成功删除旧的图像。然而,我得到了这个错误 File /var/www/mywebsite.com/Pics/Sunset3.jpg specified in action delete does not exist. 根据我的ftp,文件确实存在于该目录中。这些文件甚至作为表单的一部分显示在页面上,供用户参考已存在的图像。我听说无法在同一页面上处理
File /var/www/mywebsite.com/Pics/Sunset3.jpg specified in action delete does not exist.
根据我的ftp,文件确实存在于该目录中。这些文件甚至作为表单的一部分显示在页面上,供用户参考已存在的图像。我听说无法在同一页面上处理文件上载,您必须使用辅助文件,但这些图像是在以前访问该页面时上载的,因此它们不会在同一页面上上载和处理
这是我的密码。变量tableName是正确的,它是在代码前面定义的,加上数据库在上传尝试后反映了正确的值,它只是在删除时中断
<cfquery name="getPreviousImage" datasource="#Application.datasourceName#">
SELECT
image1, image2, image3, image4
FROM
#tableName#
WHERE
RecordID = '#form.ID#'
</cfquery>
<cfset oldImage1 = getPreviousImage.image1>
<cfset oldImage2 = getPreviousImage.image2>
<cfset oldImage3 = getPreviousImage.image3>
<cfset oldImage4 = getPreviousImage.image4>
<cfset image1 = getPreviousImage.image1>
<cfset image2 = getPreviousImage.image2>
<cfset image3 = getPreviousImage.image3>
<cfset image4 = getPreviousImage.image4>
<cfif #form.image1# NEQ "">
<cffile action="upload" destination="#Application.filePath#Pics/" filefield="image1" nameconflict="makeunique">
<cfif isDefined ("cffile.serverFile")>
<cfset image1Place = #cffile.serverFile#>
</cfif>
<cfif #getPreviousImage.image1# NEQ "" AND #image1Place# NEQ "">
<cffile action="delete" file="#Application.filePath#Pics/#oldImage1#">
</cfif>
</cfif>
<cfif #form.image2# NEQ "">
<cffile action="upload" destination="#Application.filePath#Pics/" filefield="image2" nameconflict="makeunique">
<cfif isDefined ("cffile.serverFile")>
<cfset image2Place = #cffile.serverFile#>
</cfif>
<cfif #getPreviousImage.image2# NEQ "" AND #image2Place# NEQ "">
<cffile action="delete" file="#Application.filePath#Pics/#oldImage2#">
</cfif>
</cfif>
<cfif #form.image3# NEQ "">
<cffile action="upload" destination="#Application.filePath#Pics/" filefield="image3" nameconflict="makeunique">
<cfif isDefined ("cffile.serverFile")>
<cfset image3Place = #cffile.serverFile#>
</cfif>
<cfif #getPreviousImage.image3# NEQ "" AND #image3Place# NEQ "">
<cffile action="delete" file="#Application.filePath#Pics/#oldImage3#">
</cfif>
</cfif>
<cfif #form.image4# NEQ "">
<cffile action="upload" destination="#Application.filePath#Pics/" filefield="image4" nameconflict="makeunique">
<cfif isDefined ("cffile.serverFile")>
<cfset image4Place = #cffile.serverFile#>
</cfif>
<cfif #getPreviousImage.image4# NEQ "" AND #image4Place# NEQ "">
<cffile action="delete" file="#Application.filePath#Pics/#oldImage4#">
</cfif>
</cfif>
<cfquery name="UpdateInfo" datasource="#Application.datasourceName#">
UPDATE
#tableName#
SET
title = <cfqueryparam value="#form.title#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">,
<cfif #image1Place# NEQ "">
image1 = <cfqueryparam value="#image1Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">,
</cfif>
<cfif #image2Place# NEQ "">
image2 = <cfqueryparam value="#image2Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">,
</cfif>
<cfif #image3Place# NEQ "">
image3 = <cfqueryparam value="#image3Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">,
</cfif>
<cfif #image4Place# NEQ "">
image4 = <cfqueryparam value="#image4Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">,
</cfif>
body = <cfqueryparam value="#form.body#" cfsqltype="CF_SQL_VARCHAR">
WHERE RecordID = <cfqueryparam value="#form.ID#" cfsqltype="CF_SQL_INTEGER" maxlength="50">
</cfquery>
不幸的是,我无法启用健壮的异常报告。此外,当我第一次导航到该页面时,会显示此错误。在我有机会提交表格之前。同时,此代码位于if中,只应在填写表单后执行。在尝试删除之前,可以在if语句中添加fileExists()子句。从您的代码来看,您似乎假设文件的存在是基于从数据库返回的内容,而不是基于文件系统中的实际查找
我还要确保您没有遇到文件权限或大小写问题(看起来您在*nix环境下)很遗憾,我可能无法为您提供最终答案。听起来你的服务器可能配置错误,但我真的不知道。您的文件属性(好的,linux/unix上的“模式”)也可能设置错误,因此CF可能无法查看或删除它。检查cffile命令上的mode=”“属性 下面是如何解决抛出异常的问题。只需添加对fileExists()的检查 你真的,真的需要把#form.ID#放在一个cfqueryparam中。你的数据库很容易被入侵。以下是您需要的:
WHERE
RecordID = <cfqueryparam value="#form.ID#" cfsqltype="cf_sql_integer" />
在哪里
记录ID=
另外,我希望
#tableName#
不是来自用户输入的东西。它没有作用域,因此如果有人将&tablename=foo
添加到URL,它可能会被拾取,而不是您现有的tablename变量。我建议您指定范围,可能类似于#variables.tableName#
。或者更好的办法是,不要让SQL表名成为动态的(除非你真的必须这样做)。我不认为文件权限是一些人所建议的问题。权限错误将提及有关权限的内容。因此,我假设错误是在说实话——文件确实“不”存在。仔细检查是否区分大小写(例如/Pics与/Pics)。按照建议使用Fileexists(第二个错误可能是语法错误)
在您的测试站点上启用完全健壮的调试,您将获得更多信息。您可能已经这样做了,并为此组进行了缩减
你也有一些使用不当的英镑符号
<cfif #form.something# EQ "">
磅符号实际上与输出密切相关,而不是与评估密切相关。所以这更好
<cfif form.something EQ "">
最后-为了确保代码可以获得它试图删除的文件的句柄,可以考虑命名锁,例如:
<cfif trim(form.image4) IS NOT "">
<cflock name="piclock_img4" timeout="25">
<cffile action="upload" destination="#Application.filePath#Pics/" filefield="image4" nameconflict="makeunique">
<cfif structkeyexists(cffile,"serverfile")>
<cfset image4Place = cffile.serverFile>
</cfif>
</cflock>
<cflock name="piclock_img4" timeout="10">
<cfif trim(getPreviousImage.image4) IS NOT "" AND trim(image4Place) IS NOT "">
<cffile action="delete" file="#Application.filePath#Pics/#oldImage4#">
</cfif>
</cflock>
</cfif>
如果这不起作用,你可以尝试在它们之间添加一个sleep(2000),让操作系统有时间释放文件句柄。现在有这么多不同类型的存储,很难知道底层的I/O机制,以及它是如何慢慢返回到操作系统和你的代码的
希望这能有所帮助。Ahh,文件权限可能是我的问题。我通常不使用coldfusion,因此错误似乎没有太多描述,所以我没有想到它,但这也是因为我猜服务器上的robust已关闭。我还将在该页面中实现fileexist。谢谢。我认为文件权限不是问题,我有我的网站文件夹带有read和execute,Pics文件夹带有read/write/and execute。除了上传也可以正常工作外,它只是删除。我也尝试过实现fileExists,但这只会导致另一个错误。我会在我的原始问题中发布它。谢谢你的回复。我将表名切换为静态值,这是一个错误他说他这样做是为了安全,我没有使用coldfusion,我认为这是有原因的,并把它保存在这段代码中正如您所建议的,将某些案例更改为适合,我将收到一个新错误。当我取出文件exist时,错误将消失,或者至少移动到下一个fileExist实例(对于image2)。我将在原始问题中发布错误。此外,我的权限似乎是正确的。我在上面讨论了我的设置。
<cfif #form.something# EQ "">
<cfif form.something EQ "">
<cfif trim(form.image4) IS NOT "">
<cflock name="piclock_img4" timeout="25">
<cffile action="upload" destination="#Application.filePath#Pics/" filefield="image4" nameconflict="makeunique">
<cfif structkeyexists(cffile,"serverfile")>
<cfset image4Place = cffile.serverFile>
</cfif>
</cflock>
<cflock name="piclock_img4" timeout="10">
<cfif trim(getPreviousImage.image4) IS NOT "" AND trim(image4Place) IS NOT "">
<cffile action="delete" file="#Application.filePath#Pics/#oldImage4#">
</cfif>
</cflock>
</cfif>