在afterDelete()中删除文件-CakePHP

在afterDelete()中删除文件-CakePHP,php,file,cakephp,delete-file,Php,File,Cakephp,Delete File,我有一个上传模型-包含用户上传的图像 在控制器内,我正在呼叫: $this->Upload->delete($id); 这样可以从数据库中删除记录,但我还想删除相应的图像文件 我用不同的变量尝试了很多不同的事情…等等,发现了一个类似的问题,但是-似乎什么都不起作用-我甚至无法通过这些尝试将其删除: //at the bottom of my Upload model function afterDelete() { //NONE OF THESE WORK - is thi

我有一个上传模型-包含用户上传的图像

在控制器内,我正在呼叫:

$this->Upload->delete($id);
这样可以从数据库中删除记录,但我还想删除相应的图像文件

我用不同的变量尝试了很多不同的事情…等等,发现了一个类似的问题,但是-似乎什么都不起作用-我甚至无法通过这些尝试将其删除:

//at the bottom of my Upload model
function afterDelete() {
    //NONE OF THESE WORK - is this even being called?
    unlink('/img/uploads/rest_logo.jpg');
    unlink('app/webroot/img/uploads/rest_logo.jpg');
    unlink('/app/webroot/img/uploads/rest_logo.jpg');
    unlink('img/uploads/rest_logo.jpg');
    unlink(WWW_ROOT . 'img/uploads/rest_logo.jpg');
    unlink(WWW_ROOT . '/img/uploads/rest_logo.jpg');
    return true;
}
显然,我想将其更改为动态文件名,但现在,我甚至无法让它在硬编码所有可能的路径时删除文件

有没有办法测试这里面发生了什么?像回声或。。。有什么事吗


非常感谢任何帮助或指导。

我将为您提供我的解决方案。最后,您可以看到我使用了
unlink()
函数,我可以向您保证它是有效的

我在一个组件中使用一个this函数和另一组ImageFunctions

function getImageAbsolutePath( $upload_id ){
    //To use the model in the Component
    $this->Upload = ClassRegistry::init('Upload');

    $options = array(
        'conditions' => array(
            'Upload.id' => $upload_id
        )
    );

    $upload = $this->Upload->find( 'first', $options );

    if( isset( $upload['Upload'] ) && $upload['Upload']['id'] > 0 ){
        $imgPath = WWW_ROOT . "files" . DS . "uploads" . DS . $upload['Upload']['name'];
    }else{
        $imgPath = "";
    }

    return $imgPath;

}
在控制器中

        $filePath = $uploadComponent->getImageAbsolutePath( $id );

        if( $filePath != '' && file_exists( $filePath ) ){
            if ($this->Upload->delete($id)) {
                unlink($filePath);
            }
        }

我假设您不能使用调试或正常的echo打印($val,1);。您可以使用php mail()函数将此代码的结果发送给自己:

$perms = fileperms('/the/path/the_file.ext');
应该是0755左右

你也可以呼应所有这些,然后放置一个骰子('die!');在函数的末尾,查看发生了什么。 不管怎样,如果你没有收到电子邮件,或者死刑执行停止,那就是出了问题


顺便说一下,这可能是正确的路径:取消链接(WWW_ROOT.'img/uploads/rest_logo.jpg')

这是我使用的
afterDelete
,它在我的项目中非常有效,请试用并查看:

public function afterDelete() {
    $file = new File($this->data['MyModel']['file_path']);
    $file->delete();
}

我尝试在afterDelete()中删除一个文件,但没有发现任何问题..它对我有效

    function afterDelete() {
        if(unlink(WWW_ROOT."/img/uploads/2.png")) {
            echo "Successful";
        }
        else echo "Unsuccessful";
}
我不知道你的代码有什么问题…也许你的问题是如何在删除记录后删除同一个文件。为此,可以使用beforeDelete()函数将图像名称存储在某个变量中,然后在afterDelete()中使用它


为什么要硬编码路径,而不是只将用作参数的路径传递给函数?调用
$this->Upload->delete($id)
您是否不应该调用
$this->Upload->afterDelete($id)&您在函数
$id
中缺少一个参数。这将触发一个错误,您是否有错误报告on@Dave你有权限从那个目录中删除吗?@Damien-我硬编码只是想看看我能不能让它在ALL@Dave您的假设是正确的,
afterDelete()
在调用
delete
时被触发。我可以通过取消链接来删除文件-问题是当被“afterDelete()”触发时如何执行此操作。这不是一个好方法,因为在删除文件后,您必须始终明确地取消链接。
App::uses('File', 'Utility');

// new File(string $path, boolean $create = false, integer $mode = 493) 
// $mode  = 493 default

$file = new File(WWW_ROOT . 'img/uploads/rest_logo.jpg', false, 0777);
if($file->delete()) {
   echo 'image deleted.....';
}