Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tylër

[Resolvido] Deletando imagem do servidor

Recommended Posts

Boa tarde a todos, estou com problemas ao atualizar ou deletar tópico, onde atualizar todos os dados do banco de dados, realizar o upload e atualiza o campo "imagem" no BD também, mas não deleta a imagem antiga do servidor de jeito nenhum....

 

Para adiantar, segue toda a minha classe posts_controller.php

<?phpclass PostsController extends AppController{	var $name = 'Posts';	var $uses = array( 'Post', 'Categoria' );	var $pageTitle = 'Posts';	# chamando alguns helpers para componentes especiais, como o paginate (Form)	var $helpers = array( 'Html', 'Form', 'Javascript', 'Session' );	var $paginate = array( 'limit'=>10, 'page'=>1, 'order'=>array('Post.id'=>'asc') );	var $components = array( 'UparFotos' );	function index() { 	#$this->set( 'posts', $this->Post->find('all') ); # lista todos os posts relativos ao Model 'Post' 	$this->Post->recursive = 0; 	$this->set( 'posts', $this->paginate() ); # gera a paginacao	}	function view( $id = null ) { 	$this->Post->id = $id; 	$this->set( 'post', $this->Post->read() ); # lendo um post especifico	}	function add() { 	$categoria = $this->Categoria->find( 'list', array('conditions'=>'categoria.id') ); 	$this->set( 'categoria', $categoria ); 	if( !empty($this->data) ) { 	$path = '../../../images/posts'; 	# Se houver uma foto, mando para o componente 	if( $this->data['Post']['fotodestaque']['name'] ) { 	$nome_novo = date('HisYmd'); 	# Envia o conteudo do field para o componente 	$this->UparFotos->fotos( $this->data['Post']['fotodestaque'] ); 	$resultado = $this->UparFotos->redimensiona_salva( 250, $path, $nome_novo ); 	# Salva a imagem no BD 	$this->data['Post']['photo'] = $resultado; 	} 	if( $this->Post->save($this->data) ) { 	$this->Session->setFlash('O post foi salvo!', 'default', array('class'=>'flash_good') ); 	$this->redirect('/posts/'); 	} 	}	}	function edit( $id = null ) { 	$this->Post->id = $id; 	if( !empty($this->data) ) { 	if( $this->data['Post']['fotodestaque']['name'] ) { 	if( $this->data['Post']['photo'] ) { 	unlink("../../../images/posts/".$this->data['Post']['photo']); 	} 	$this->UparFotos->fotos( $this->data['Post']['fotodestaque'] ); 	$nome_novo = date('HisYmd'); 	$resultado = $this->UparFotos->redimensiona_salva( 250, "../../../images/posts/", $nome_novo ); 	$this->data['Post']['photo'] = $resultado; # seta o novo nome da imagem 	} 	$this->Post->save($this->data); 	$this->Session->setFlash( 'O post foi atualizado!', 'default', array('class'=>'flash_good') ); 	$this->redirect('/posts/'); 	 	} else { 	$this->data = $this->Post->read( null, $id ); 	$categoria = $this->Categoria->find( 'list' ); 	$this->set( 'categoria', $categoria ); 	}	}	function delete( $id = null )	{ 	#if( $this->data['Post']['photo'] ) { 	unlink("../../../images/posts/".$this->data['Post']['photo']); 	#} 	#$this->Post->del($id); 	#$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); 	#$this->redirect('/posts/');	}}?>

 

Necessito de ajuda, aguardo retorno! Imagem Postada

 

Tanks!

 

 

É como se fôssemos fazer isto:

 

 

function deletar($id = null){ // deletamos a noticia (model) pelo seu $id if($this->Noticia->delete($id)){ $this->Session->setFlash('Deletado com sucesso!'); } }
Mas inserindo o unlink para deletar as respectivas imagens deste tópico em específico, ficando assim:

 

 

 

function deletar( $id = null ){ 	$path = "../../../images/posts/"; 	if( unlink($path.$this->data['Post']['photo']) ) { 	$this->Post->del($id); 	$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); 	$this->redirect('/posts/'); 	}}
Olha o warning:

 

Warning (2): unlink(../../../images/posts/) [function.unlink]: Permission denied [APPcontrollersposts_controller.php, line 74]

 

Me parece que não está pegando a imagem...

 

Alguém?

Compartilhar este post


Link para o post
Compartilhar em outros sites

De um pr() em $this->data['Post'] para ver se esta tudo certo. (poste aki)

Para fazer o unlink:

unlink(Router::url('/images/posts/minhaImage.jpg'))
;

É melhor para pegar o caminho corretamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

* Oh, tanks Lucas por me add como amigo rsrssrr

 

Eh, não tá retornando a imagem, é isso ~~

 

function delete( $id = null )
{
 $this->Post->id = $id;
 #if( $this->data['Post']['photo'] ) {
 //unlink( Router::url("/files/images/".$this->data['Post']['photo']) );
 pr('saída: '.$this->data['Post']['photo']);
 #}
 #$this->Post->del($id);
 #$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') );
 #$this->redirect('/posts/');
}

retorno: saída:

 

 

Olha que curioso:

 

se eu fizer isto: pr('saída: '.$this->Post->photo = $id); retorna a id do tópico mas não tá dando certo pra pegar a imagem do BD...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ao buscar assim:

 

pr( $this->Post->findById( $id ) );

 

obtenho o array:

 

Array
(
 [Post] => Array
 (
 [id] => 36
 [categoria_id] => 1
 [photo] => 09245720100714.jpg
 [title] => Certificado de segurança em seu site de vendas
 [body] => 
 Insira seu texto aqui...



 [created] => 2010-07-14 09:24:57
 [modified] => 2010-07-14 09:24:57
 )

 [categoria] => Array
 (
 [id] => 1
 [title] => Categoria 1
 [created] => 2010-07-01 23:24:09
 [modified] => 2010-07-01 23:42:16
 )
)

assim:

 

 

pr( $this->Post->id = $id );

 

obtenho a id do tópico...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola meu velho

 

eu tava olhando a postagem

 

aquele warning ta meio estranho Imagem Postada

 

colocar uma img dentro da pasta que você deleta exemplo: 1.jpg Imagem Postada

e tentar isso aqui

 


function deletar( $id = null )
{
$path = "../../../images/posts/1.jpg";
unlink($path);
}
}

 

outra coisa legal e usar o file_exists e o chmod na pasta

 

gere pasta dinamicar com o id_do post assim você tem mais liberdade Imagem Postada

e nao faz pesquisa de imagem no banco e isso pelo id do post

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá meu velho, realizei o teste e funcionou ;]

 

Então não está pegando a imagem do bd..

 

Bom. vou passar toda a modelagem aí::

 

---- Banco de Dados: `cms`---- ------------------------------------------------------------ Estrutura da tabela `posts`--DROP TABLE IF EXISTS `posts`;CREATE TABLE IF NOT EXISTS `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `categoria_id` int(11) NOT NULL, `photo` varchar(80) COLLATE utf8_bin NOT NULL, `title` varchar(50) COLLATE utf8_bin NOT NULL, `body` text COLLATE utf8_bin NOT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `FOREGNY KEY` (`categoria_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='table to posts' AUTO_INCREMENT=37 ;
post_controller.php

 

<?phpclass PostsController extends AppController{	var $name = 'Posts';	var $uses = array( 'Post', 'Categoria' );	var $paginate = array( 'limit'=>10, 'page'=>1, 'order'=>array('Post.id'=>'asc') );	function view( $id = null, $json = false ) { 	$this->Post->id = $id; 	$this->set( 'post', $this->Post->read() ); # lendo um post especifico 	if( $json ) { 	$this->view = 'Json'; 	$this->set( 'json', 'posts' ); 	}	}	function delete( $id = null )	{ 	#if( $this->data['Post']['photo'] ) { 	//unlink( Router::url("/files/images/".$this->data['Post']['photo']) ); 	$path = "../../../files/images/1_1.jpg"; 	unlink($path); 	# $photo = $this->Post->read( 'photo', $id ); 	# pr('saída: '.$photo); 	#pr( $this->Post->findById( $id ) ); 	#pr( $this->Post->id = $id ); 	#pr( $this->Post->photo = "/files/images/".$this->data['Post']['photo'] ); 	#pr( 'saída: '.$this->data['Post']['photo'] ); 	// unlink( Router::url( "/files/images/".$image ) ); 	// unlink( Router::url( "/files/thumbs/".$image ) ); 	#} 	#$this->Post->del($id); 	#$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); 	#$this->redirect('/posts/');	}}?>
kakaroto, depois que deletei a imagem, executei a pagina novamente e mostrou um warning parecido, pois a imagem já nao se encontrava lá...

Então está confirmado de que no meu caso, não está buscando a imagem do banco de dados, onde deixa o caminho assim: /images/files/ sem a imagem.. Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

O mesmo array de cima:

 

Array
(
 [Post] => Array
 (
 [id] => 36
 [categoria_id] => 1
 [photo] => 09245720100714.jpg
 [title] => Certificado de segurança em seu site de vendas
 [body] => 
 Insira seu texto aqui...



 [created] => 2010-07-14 09:24:57
 [modified] => 2010-07-14 09:24:57
 )

 [categoria] => Array
 (
 [id] => 1
 [title] => Categoria 1
 [created] => 2010-07-01 23:24:09
 [modified] => 2010-07-01 23:42:16
 )

)

 

E aí está o campo da imagem:

 

[photo] => 09245720100714.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você tem o nome da imagem, basta deletar agora:

$path = '../../../files/images/';
$data = $this->Post->findById($id);
$file = $path . $data['Post']['photo'];
if(file_exists($file)){
   if(unlink($file)){
      $this->Session->setFlash('Imagem deletada!', 'default', array('class'=>'flash_good') );
   }
}else{
      $this->Session->setFlash('A imagem não existe', 'default', array('class'=>'flash_bad') );
}

Veja se corre tudo certo =)

 

OBS: O CakePHP tem uma classe para manipulação de arquivos, pode ser interessante dar uma olhada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe o atraso para responder!

Estás solucionado! o/

Bom, agora estás tudo conforme desejado! Imagem Postada

 

... mas se fosse preciso deletar todo o diretório?

Tentei o uso com GLOB_GRACE mas este, limpou todo o diretório, mas não o deletou =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para deletar um diretório é uma função diferente: http://br3.php.net/manual/en/function.rmdir.php

E ela só deleta diretórios vazios.

Descendo mais um pouco a página você encontra funções feita pelos users que deletam o diretório e os arquivos e diretórios deste, como:

function remove_dir($current_dir) {
   
        if($dir = @opendir($current_dir)) {
            while (($f = readdir($dir)) !== false) {
                if($f > '0' and filetype($current_dir.$f) == "file") {
                    unlink($current_dir.$f);
                } elseif($f > '0' and filetype($current_dir.$f) == "dir") {
                    remove_dir($current_dir.$f."\\");
                }
            }
            closedir($dir);
            rmdir($current_dir);
        }
    }

Tem várias outras lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito melhor que o GLOB_BRACE

 

Muito obrigado mais uma vez! Imagem Postada

 

Lucas... a última dúvida...

 

Se a estrutura dos arquivos é assim:

|- posts |- 1 |---- images |---------- 1.jpg |---------- 2.jpg |---- thumbs |---------- 1.jpg |---------- 2.jpg
vou precisar realizar outro teste pra verificar se existem outros diretórios além do diretóri "/1/" ?

 

$path = '../../../files/images/posts'; 	$dirImages = 'images'; 	$dirThumbs = 'thumbs'; 	$data = $this->Categgallery->findById($id); 	$current_dir = $path.'/'.$id; 	if( $dir = @opendir( $current_dir ) ) { 	while( ( $f = readdir($dir) ) !== false ) { 	if( $f > '0' and filetype( $current_dir.$f ) == 'file' ) { 	unlink( $current_dir.$f ); 	} elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' ) { 	delete( $current_dir.$f.''.$dirThumbs.'' ); // nao deleta 	delete( $current_dir.$f.''.$dirImages.'' ); // nao deleta 	delete( $current_dir.$f.'' ); // nao deleta 	} 	} 	closedir( $dir ); # fecha o diretorio 	rmdir( $current_dir ); # deleta o diretorio
Tentei assim mas não obtive sucesso:

 

 

 

function delete( $id = null, $empty = false ) { 	$path = '../../../files/images/posts'; 	$dirImages = 'images'; 	$dirThumbs = 'thumbs'; 	$data = $this->Categgallery->findById($id); 	$directory = $path.'/'.$id; 	if( substr($directory,-1) == "/" ) { 	$directory = substr($directory,0,-1); 	} 	if( !file_exists($directory) || !is_dir($directory) ) { 	return false; 	} elseif( !is_readable($directory) ) { 	return false; 	} 	else 	{ 	$directoryHandle = opendir( $directory ); 	while ( $contents = readdir($directoryHandle) ) 	{ 	if( $contents != '.' && $contents != '..' ) { 	$path = $directory . "/" . $contents; 	if( is_dir($path) ) { 	delete( $path ); 	} else { 	unlink( $path ); 	} 	} 	} 	closedir( $directoryHandle ); 	if( $empty == false ) { 	if( !rmdir($directory) ) { 	return false; 	} 	} 	 	return true; 	} 	$this->redirect( '/posts/' ); 		}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, minha dúvida é em saber como deletar toda esta estrutura aqui:

 

|- posts
|- 1
|
|---- images
|---------- 1.jpg
|---------- 2.jpg
|
|---- thumbs
|---------- 1.jpg
|---------- 2.jpg

Antes você me passou um código que deletavam todos os arquivos e por último os diretórios...

E acima eu te passei o código que tentei utilizar pra realizar esta mesma checagem mas com mais diretórios e arquivos dentro deles....

 

Bom... não dava certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, pesquisei muito e não consegui encontrar nada só warnings ~~

 

Vou explicar bem detalhadamente:

 

Como apagar vários diretórios , subdiretórios e arquivos dentro deles de uma vez no cakePHP?

 

No php usa-se funções como estas:

 

http://www.php.net/m...ction.rmdir.php

 

Não consegui adaptar para deletar diretório dentro de diretório e imagens dentro deles....

Minha estrutura é assim:

 

|- /posts/
|
|------ /images/
|------------ /imagem_1.jpg (esta dentro de /images/)
|------------ /imagem_2.jpg
|
|------ /thumbs/
|------------ / imagem_1.jpg (esta dentro de /thumgs/)

VISUALIZAÇÃO

 

Imagem Postada

 

Acima a imagem de tudo que estou tentando apagar ( tudo dentro do diretório 2, que é a id acessada )

 

A url acessada: http://localhost/min...leries/delete/2

 

A função utilizada e as demais maneiras também:

 

function delete( $id = null ) {

 	$path = '../../../files/images/galleries';
 	$data = $this->Categgallery->findById($id);

 	$current_dir = $path.'/'.$id.'/';

 	if( $dir = @opendir( $current_dir ) ) {
 	while( ( $f = readdir($dir) ) !== false ) {
 	# Deletando imagens do diretorio
 	if( $f > '0' and filetype( $current_dir.$f ) == 'file' ) {
 	unlink( $current_dir.$f );
 	}
 	# Deletando diretorio vazio
 	elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' ) {
 	delete( $current_dir.$f.'\\' );
 	}
 	}
 	closedir( $dir ); # fecha o diretorio
 	rmdir( $current_dir ); # deleta o diretorio

 	//$this->Categgallery->delete( $id ); # deletando post
 	//$this->Session->setFlash( 'Galeria deletada!', 'default', array( 'class'=>'flash_good' ) );

 	} else {
 	//$this->Session->setFlash( 'Erro ao deletar galeria!', 'default', array( 'class'=>'flash_bad' ) );
 	}


 	/*
 	if( is_dir($dir) )
 	{
 	$objects = scandir( $dir );
 	foreach( $objects as $object ) {
 	if( $object != "." && $object != ".." ) {
 	if( filetype( $dir.$object ) == "dir" )
 	delete( $dir.$object );
 	elseif( filetype( $dir.$object ) == "file" )
 	unlink( $dir.$object );
 	}
 	}
 	reset( $objects );
 	rmdir( $dir );
 	}
 	*/

 	//$this->redirect( '/categgalleries/' );
 	
	}

O warning visualizado: Fatal error: Call to undefined function delete() in C:\wamp\www\minha_cms\cake\app\controllers\categgalleries_controller.php on line 96

 

 

Linha 96:

delete( $current_dir.$f.'\\' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nosss

 

Hj meu cérebro inchou do tamanho da lua pra resolver isso aqui e nem por isso foi uma solução profissional ~~

 

$data = $this->Categgallery->findById($id);

 	$path = '../../../files/images/galleries';
 	$dirImages = 'images/';
 	$dirThumbs = 'thumbs/';

 	$current_dir = $path.'/'.$id.'/';

 	if( !is_dir($current_dir) || !$data['Categgallery']['id'] ) {
 	$this->Session->setFlash( 'Erro ao deletar galeria!', 'default', array( 'class'=>'flash_bad' ) );
 	$this->redirect( '/categgalleries/' );
 	} else {

 	# Realizando a magica! :)/>

 	if( $dir = @opendir( $current_dir.$dirThumbs ) ) {
 	while( ( $f = readdir( $dir ) ) !== false ) {
 	if( $f > '0' and filetype( $current_dir.$dirThumbs.$f ) == 'file' )
 	unlink( $current_dir.$dirThumbs.$f );
 	elseif( $f > '0' and filetype( $current_dir.$dirThumbs.$f ) == 'dir' )
 	delete( $current_dir.$dirThumbs.$f.'\\' );
 	}
 	closedir( $dir ); # Fecha o diretorio
 	rmdir( $current_dir.$dirThumbs );
 	}

 	if( $dir = @opendir( $current_dir.$dirImages ) ) {
 	while( ( $f = readdir( $dir ) ) !== false ) {
 	if( $f > '0' and filetype( $current_dir.$dirImages.$f ) == 'file' )
 	unlink( $current_dir.$dirImages.$f );
 	elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' )
 	delete( $current_dir.$dirImages.$f.'\\' );
 	}
 	closedir( $dir );
 	rmdir( $current_dir.$dirImages );
 	}

 	if( $dir = @opendir( $current_dir ) ) {
 	while( ( $f = readdir( $dir ) ) !== false ) {
 	if( $f > '0' and filetype( $current_dir.$f ) == 'file' )
 	unlink( $current_dir.$f ); # Deletando imagens do diretorio
 	elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' )
 	delete( $current_dir.$f.'\\' ); # Deletando diretorio vazio
 	}
 	closedir( $dir );
 	rmdir( $current_dir ); # Deleta o diretorio
 	}
}

Mas pelo menos me será muito útil! :)/>

 

ESTRUTURA

 

Imagem Postada

 

 

 

DELETANDO

 

Imagem Postada

 

 

 

PRONTO :)/>

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.