Ir para conteúdo

POWERED BY:

Arquivado

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

3l3tr1c

[Resolvido] Converter imagem antes de gravar

Recommended Posts

Olá!

 

Estou tentando mudar o formato de imagens enviadas pelos usuários. O user manda a imagem e ela é convertida antes de ser gravada no diretório do servidor. Observem:

 

if ($formato == "image/jpeg") {

        $img = imagecreatefromjpeg($file['name']);
	$nome = imagegif($img, md5($file['name']) . '.gif'); //esse empacotamento que voces veem é apenas para garantir que o nome não terá caracteres especiais. Essa é a forma mais prática que pensei.
	
}
Erro retornado:

Warning: imagecreatefromjpeg(imagem.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in C:\wamp\www\teste\img.php on line 20

 

O problema é que ele não acha o diretório original da imagem e nem vai achar pq ele está na máquina do usuário. Já tentei pegar a imagem do diretório temporário mas não dá.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando o usuário faz um upload, o arquivo é gravado em um diretório temporário no servidor; Normalmente você não tem acesso de leitura a esse diretório então, você deverá, necessariamente, utilizar a função move_uploaded_file() para mover o arquivo do upload, antes de começar a trabalhar com ele:

 

<?php
/**
* Nosso novo diretório temporário
* @var string
*/
$myTempDir = './temp';

/**
* Usaremos essa matriz em vez da super global $_FILES para acessar
* os arquivos do upload
* @var array
*/
$myFiles = array();

/**
* Verificamos a existência do diretório temporário, se não existir
* tentamos criá-lo.
*/
if ( !is_dir( $myTempDir ) ){
$pathinfo = pathinfo( $myTempDir );

/**
 * Precisamos que o diretório base, onde o temporário será criado
 * tenha permissões de gravação.
 */
if ( is_writable( $pathinfo[ 'dirname' ] ) ){

	/**
	 * Ok, temos permissões de gravação, vamos criar o diretório
	 * temporário.
	 */
	mkdir( $myTempDir , 0760 );
} else {
	trigger_error( sprintf( 'Não temos permissões de gravação em %s para criar o diretório temporário.' , $pathinfo[ 'dirname' ] ) , E_USER_ERROR );
}
} else {
/**
 * Como o diretório já existia, verificamos se existe algum arquivo nele.
 * Se existir, apagamos todos já que se trata de "diretório temporário".
 */
foreach ( glob( sprintf( '%s/*.*' , $myTempDir ) ) as $tmpFile ){
	unlink( $tmpFile );
}
}

/**
* Movemos todos os arquivos do upload para nosso diretório temporário
*/
foreach ( $_FILES as $key => $file ){
$destination = sprintf( '%s/%s' , $myTempDir , $file[ 'tmp_name' ] );

if ( $file[ 'error' ] == UPLOAD_ERR_OK ){
	if ( move_uploaded_file( $file[ 'tmp_name' ] , $destination ) !== false ){
		$myFiles[ $key ] = $file;
		$myFiles[ $key ][ 'tmp_name' ] = $destination;
	} else {
		trigger_error( sprintf( 'Falha ao mover o arquivo %s para o diretório temporário.' , $file[ 'name' ] ) , E_USER_WARNING );
	}
}
}

 

Com isso ai, você terá agora uma matriz chamada $myFiles contendo os arquivos do upload, mas no seu diretório temporário, com todas as permissões necessárias.

 

Tudo o que você precisará fazer agora é trocar as referências à $_FILES para $myFiles:

 

$file = $myFiles[ 'nome_do_campo' ];
$formato = $file[ 'type' ];

if ($formato == "image/jpeg") {

	$img = imagecreatefromjpeg($file['tmp_name']); //Aqui você deve usar "tmp_name" e não "name"
	$nome = imagegif($img, md5($file['name']) . '.gif'); //esse empacotamento que voces veem é apenas para garantir que o nome não terá caracteres especiais. Essa é a forma mais prática que pensei.

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sieg Heil João !

 

Muito obrigado cara. Mais algumas perguntas: após copiar o arquivo do diretório temporário eu terei que apagar os arquivos dele, não é? Caso sim, farei isso no final do primeiro script. Outra coisinha: se eu tenho que criar o diretório temporário, então, é melhor copiar o arquivo do diretório temporário, que não tenho acesso, para outra pasta e lá dentro mudar o formato dele e o nome também e em seguida apagar o anterior. O que acha? Valeu mais uma vez!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais algumas perguntas: após copiar o arquivo do diretório temporário eu terei que apagar os arquivos dele, não é?

 

Sim, mas o primeiro código já faz isso para você:

 

/**
* Como o diretório já existia, verificamos se existe algum arquivo nele.
* Se existir, apagamos todos já que se trata de "diretório temporário".
*/
foreach ( glob( sprintf( '%s/*.*' , $myTempDir ) ) as $tmpFile ) {
unlink( $tmpFile );
}

 

se eu tenho que criar o diretório temporário, então, é melhor copiar o arquivo do diretório temporário, que não tenho acesso, para outra pasta e lá dentro mudar o formato dele e o nome também e em seguida apagar o anterior.

 

Já estamos fazendo isso também.

 

Aqui criamos o novo diretório temporário.

/**
* Ok, temos permissões de gravação, vamos criar o diretório
* temporário.
*/
mkdir( $myTempDir , 0760 );

 

Aqui apagamos do diretório temporário original e movemos para o novo.

/**
* Movemos todos os arquivos do upload para nosso diretório temporário
*/
foreach ( $_FILES as $key => $file ) {
$destination = sprintf( '%s/%s' , $myTempDir , $file[ 'tmp_name' ] );

if ( $file[ 'error' ] == UPLOAD_ERR_OK ) {
	if ( move_uploaded_file( $file[ 'tmp_name' ] , $destination ) !== false ) {
		$myFiles[ $key ] = $file;
		$myFiles[ $key ][ 'tmp_name' ] = $destination;
	} else {
		trigger_error( sprintf( 'Falha ao mover o arquivo %s para o diretório temporário.' , $file[ 'name' ] ) , E_USER_WARNING );
	}
}
}

 

Cada vez que um upload for feito, os arquivos temporários antigos serão removidos, então, tudo o que você precisa fazer é incluir o primeiro código no seu código que tratará os uploads.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu João. Não querendo puxar seu caso por ter me ajudado, mas particularmente gosto de suas ajudas porque você além de ajudar nos dar uma aula de programação. Fica na paz e Até mais!

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas particularmente gosto de suas ajudas porque você além de ajudar nos dar uma aula de programação.

 

heheheh :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só como eu fiz:

http://forum.imasters.com.br/index.php?/topic/399876-upload-de-imagem-e-redimensionamento/

 

Esse caso não precisei criar o diretório temporário, pois logo após de gravar a imagem no diretório normal ela é sobreposta por ela mesmo só que com características diferentes (nome, formato, tamanho). Boa sorte!

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.