coldfusion cffile删除问题

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,文件确实存在于该目录中。这些文件甚至作为表单的一部分显示在页面上,供用户参考已存在的图像。我听说无法在同一页面上处理

我有一个页面,用户可以用4个图像和一些其他字段更新页面。已经有一个图像上传的每个文件输入,当他们上传一个新的我想采取新的图像,上传它,然后如果上传成功删除旧的图像。然而,我得到了这个错误

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>