Удаление файла в afterDelete () - CakePHP - PullRequest
3 голосов
/ 01 июня 2011

У меня есть модель загрузки - содержит изображения, загруженные пользователем.

Внутри контроллера я звоню:

$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;
}

Очевидно, что я хочу изменить его на динамическое имя файла, но сейчас я даже не могу заставить его удалить файл при жестком кодировании всех возможных путей, которые я могу придумать.

Есть ли способ проверить, что происходит в этом? Как эхо или ... что-нибудь?

Любая помощь или направление очень ценится.

Ответы [ 5 ]

14 голосов
/ 13 апреля 2012
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.....';
}

Подробная информация о файловой утилите

2 голосов
/ 13 апреля 2012

Я попытался удалить файл в afterDelete () и не нашел никаких проблем ... Это сработало для меня ..

    function afterDelete() {
        if(unlink(WWW_ROOT."/img/uploads/2.png")) {
            echo "Successful";
        }
        else echo "Unsuccessful";
}

Я не знаю, в чем проблема с вашим кодом ..Возможно, ваша проблема заключается в том, как удалить тот же файл после удаления его записи.Для этого вы можете использовать функцию beforeDelete (), чтобы сохранить имя изображения в определенной переменной, а затем использовать его в afterDelete ().

1 голос
/ 12 апреля 2012

Это afterDelete, который я использую, и он отлично работает в моем проекте, попробуйте и посмотрите:

public function afterDelete() {
    $file = new File($this->data['MyModel']['file_path']);
    $file->delete();
}
0 голосов
/ 12 апреля 2012

Полагаю, вы не можете использовать отладку или обычное эхо print_r ($ val, 1) ;. Вы можете отправить результаты этого кода по почте с помощью функции php mail ():

$perms = fileperms('/the/path/the_file.ext');

Это должно быть что-то вроде 0755.

Вы также можете повторить все это и поместить кубик («умри!»); в конце функции и посмотрите, что происходит. В любом случае, если вы не получили электронное письмо или выполнение остановилось, значит что-то не так.

Кстати, это, вероятно, правильный путь: unlink (WWW_ROOT. 'Img / uploads / rest_logo.jpg');

0 голосов
/ 01 июня 2011

Я собираюсь дать вам свое решение. В конце вы видите, что я использую функцию unlink() и могу вас заверить, что она работает.

Я использую эту функцию внутри компонента с другим набором 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);
            }
        }
...