在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.....';
}