Para efetuar o upload de arquivos em PHP basta acessar a coleção $_FILES do PHP, ela armazena os dados dos arquivos enviados para o servidor.
No exemplo abaixo, vamos separar o código do formulário (formulario.html) do script que faz o upload:
<!DOCTYPE html>
<html>
<head>
<title>Formulário</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<h1>Formulário</h1>
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="300000" />
<p>Selecione o arquivo <input name="userfile" type="file" /></p>
<p><input type="submit" value="Enviar arquivo" /></p>
</form>
</body>
</html>
Crie um arquivo com o nome upload.php. Este arquivo receberá o arquivo e o gravará em um diretório:
<?php
$OK = Verificacao($_FILES);
//gera um nome tratado para os padrões web
$sArquivo = 'uploads/' . TratarNomeArquivo($_FILES['userfile']['name']);
//Se os dados enviados foram aprovados pela verificação
if ($OK == '') {
//move o arquivo salvo para a pasta de destino, já com o novo nome
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $sArquivo)) {
echo '<p>Arquivo ' . $sArquivo . ' carregado com sucesso!';
echo '<p><img src="' . $sArquivo . '" /></p>';
} else {
print "Possível ataque de upload! Aqui esta alguma informação:\n";
print_r($_FILES);
}
} else {
echo '<p><strong>Erro ao salvar arquivo</strong></p>';
echo "<p>Detalhes do erro: $OK</p>";
}
//trata o nome de arquivo tornando-o compatível com os padrões web
function TratarNomeArquivo($string){
$sExtensao = pathinfo($string, PATHINFO_EXTENSION);
$sRet = str_replace(' ', '-', trim(preg_replace("[^a-zA-Z0-9\_\-\ ]", " ",
strtr(substr($string, 0, strlen($string) - strlen($sExtensao)),
"áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ", "aaaaeeiooouucAAAAEEIOOOUUC"))) . '.' . $sExtensao);
while (strpos($sRet, '--')) $sRet = str_replace('--', '-', $sRet);
return $sRet;
}
//Verifica o tamanho e a extensão do arquivo
function Verificacao($aDados) { //Verificação de segurança
$aExtensoesPermitidas = Array('gif', 'jpg', 'jpeg', 'png'); //Extensões permitidas
$iMaxTamanhoArquivo = 300000; //Tamanho máximo do arquivo permitido
$sRet = '';
if (in_array(pathinfo($aDados['userfile']['name'],
PATHINFO_EXTENSION), $aExtensoesPermitidas)) {
if ($aDados['userfile']['size'] > $iMaxTamanhoArquivo) {
$sRet = "Tamanho do arquivo excede o máximo permitido.";
}
} else {
$sRet = "Tipo de arquivo não permitido.";
}
return $sRet;
}
?>
Importante: você deve tomar cuidado com as extensões permitidas durante o upload. O recomendado é que apenas extensões de imagens (gif, jpg e png) sejam permitidas. Jamais permita o upload de arquivos .php, caso contrário seu site estará vulnerável.