Upload de imagens com PHP

Nenhum produto encontrado nessa seleção.

Uma parte bastante importante do seu código PHP é o envio de arquivos para o servidor. É importante que você entenda como manipular arquivos assim que eles são enviados.

Neste artigo você vai aprender a criar um formulário muito simples para upload de imagens com PHP.

O formulário HTML

Para o formulário HTML, é importante prestar bastante atenção nos atributos que você vai configurar, veja:

<form enctype="multipart/form-data" action="arquivo_de_envio.php" method="post">

São elas:

enctype="multipart/form-data"

Indica que você vai enviar arquivos para o servidor, se não tiver este atributo você só vai conseguir enviar texto.

action="arquivo_de_envio.php"

Aqui você indica o arquivo que vai receber a postagem dos arquivos (e texto se tiver).

method="post"

O método de envio.

Veja como ficou nosso formulário simples:

<form enctype="multipart/form-data" action="arquivo_de_envio.php" method="post">
	<input name="userfile[]" type="file" multiple /><br />
	<input type="submit" value="Enviar" />
</form>

Perceba no input, os atributos name="userfile[]", type="file" e multiple.

  • O atributo "name" recebeu chaves porque vou enviar vários arquivos, não apenas um.
  • O atributo "type" indica que vou enviar arquivos (file)
  • O atributo "multiple" indica que posso selecionar vários arquivos ao mesmo tempo (ou apenas um).

Vamos utilizar o formulário indicado acima para enviar nossos dados, porém, vou deixar o atributo "action" em branco, já que vou enviar tudo para o mesmo arquivo.

Veja:

<form enctype="multipart/form-data" action="" method="post">
	<input name="userfile[]" type="file" multiple /><br />
	<input type="submit" value="Enviar" />
</form>

O PHP

Para o PHP, não vamos utilizar o método convencional já que vou enviar vários arquivos.

A primeira coisa que vou fazer é verificar se algo foi postado:

<?php
if ( 
	     isset( $_FILES['userfile'] )
	&& ! empty( $_FILES['userfile'] )  
) {
    // O resto vem aqui
}

Conforme descrito no comentário do trecho anterior, vamos colocar os dados onde ele está.

Agora vamos configurar algumas variáveis para receber os dados enviados pelo formulário.

$imagens         = $_FILES['userfile'];
$nomes_imagens   = $imagens['name'];
$tipos_imagens   = $imagens['type'];
$tmp_imagens     = $imagens['tmp_name'];
$erro_imagens    = $imagens['error'];
$tamanho_imagens = $imagens['size'];

As chaves indicadas acima são padrão.

  • name = nome
  • type = mime type
  • tmp_name = nome temporário
  • error = se ocorrer algum erro no envio
  • size = tamanho em bytes

Para este demo, vamos fazer algumas verificações sobre o arquivo enviado, a começar pelo tipo. Por isso, vamos criar um array onde colocaremos os tipos permitidos.

$permitir_tipos  = array(
	'image/bmp', 
	'image/x-windows-bmp', 
	'image/gif', 
	'image/jpeg', 
	'image/pjpeg',
	'image/png',
);

Agora vamos fazer um laço para percorrer o array de dados enviados:

for ( $i = 0; $i < count( $erro_imagens ); $i++ ) {
	if ( $erro_imagens[$i] != 0 ) {
		echo 'Erro ao enviar imagem ' . $nomes_imagens[$i];
	} else {
		if ( in_array( $tipos_imagens[$i], $permitir_tipos ) ) {
			if ( @move_uploaded_file( $tmp_imagens[$i], 'imagens/' . $nomes_imagens[$i] ) ) {
				echo '<img src="imagens/' . $nomes_imagens[$i] . '" style="width: 200px; height: auto;">';
			} else {
				echo 'Erro ao enviar imagem!';
			}
		} else {
			echo 'Envie apenas imagens.';
		}
	}
}

Dentro do laço, checamos se os tipos enviados estão dentro dos tipos das imagens, se existe algum erro, e se a imagem foi enviada com sucesso. Caso tudo ocorra conforme previsto, a imagem é movida para a pasta "imagens" e, em seguida, apresentada na tela do navegador.

Código completo

Veja abaixo como ficou nosso código completo:

<form enctype="multipart/form-data" action="" method="post">
	<input name="userfile[]" type="file" multiple /><br />
	<input type="submit" value="Enviar" />
</form>

<?php
// Verifica se algo foi enviado
if ( 
	     isset( $_FILES['userfile'] )
	&& ! empty( $_FILES['userfile'] )  
) {
	// Configura as variáveis
	$imagens         = $_FILES['userfile'];
	$nomes_imagens   = $imagens['name'];
	$tipos_imagens   = $imagens['type'];
	$tmp_imagens     = $imagens['tmp_name'];
	$erro_imagens    = $imagens['error'];
	$tamanho_imagens = $imagens['size'];
	
	// Os mime types permitidos
	$permitir_tipos  = array(
		'image/bmp', 
		'image/x-windows-bmp', 
		'image/gif', 
		'image/jpeg', 
		'image/pjpeg',
		'image/png',
	);
	
	// Verifica se a variável de erro contém um array
	if ( ! is_array( $erro_imagens ) ) {
		exit('Nada enviado!');
	}
	
	// O laço 
	for ( $i = 0; $i < count( $erro_imagens ); $i++ ) {
	
		// Verifica se ocorreu algum erro
		if ( $erro_imagens[$i] != 0 ) {
		
			// Mostra o erro
			echo 'Erro ao enviar imagem ' . $nomes_imagens[$i];
		
		} else {
		
			// Verifica se os mime types estão entre os permitidos
			if ( in_array( $tipos_imagens[$i], $permitir_tipos ) ) {
			
				// Verifica se o arquivo foi movido com sucesso (e move)
				if ( @move_uploaded_file( $tmp_imagens[$i], 'imagens/' . $nomes_imagens[$i] ) ) {
					
					// Mostra a imagem
					echo '<img src="imagens/' . $nomes_imagens[$i] . '" style="width: 200px; height: auto;">';
				
				} else {
				
					// Mostra o erro no envio
					echo 'Erro ao enviar imagem!';
				}
				
			} else {
				
				// Mostra o erro de tipos
				echo 'Envie apenas imagens.';
			
			} // Fim dos tipos permitidos
			
		} // Fim - Verifica se ocorreu algum erro
		
	} // Fim - O laço
} // Fim - Verifica se algo foi enviado
?>

É um formulário bem simples, mas serve para você entender como funciona o envio de arquivos para o servidor.

Com Ajax

Caso queira adaptar a validação desse formulário para Ajax, basta seguir nosso tutorial:

O formulário do artigo acima não tem validação nas imagens, você deverá fazer isso utilizando os códigos detalhados anteriormente neste tutorial.

Download

Caso queira baixar o código gerado neste tutorial, basta acessar o link abaixo:

Concluindo

Este não é um formulário para você utilizar em sites profissionais ou em produção, é apenas educativo, portanto, antes de utiliza-lo em algum projeto, avalie-o.

Caso tenha alguma dúvida, deixe um comentário.