Upload de arquivos é um assunto complicado, pois ele é uma brecha pra varios ataques se não for feito de maneira correta. Temos que estabelecer alguns LIMITES obrigatóriamente se quisermos ter segurança.
1° Nunca permita qualquer tipo de arquivo para upload, pricipalmente se for arquivos de script(HTML, PHP, ASP…)
2° Estabeleça o tamanho máximo de arquivo, pois com práticas hacker pode-se derrubar seu servidor com “Negação de Serviço“.Lembrando que caso vc tenha acesso ao php.ini, vc deve configurar o tamanho permitido pelo PHP na linha que contém: upload_max_filesize, por padrão ele está setado para aceitar 2M (2 MB), mas você pode aumentar ou diminuir este tamanho.
3° Não mostre erros detalhados, aqui eu vou dar exemplo, mas use um único erro pra qualquer tipo de erro, e se quiser crie uma função pra salvar o tipo de erro pra você analisar mais tarde, no Banco de Dados.
Há inúmeras maneiras de se fazer isso, vou tentar mostrar aqui a maneira mais simples, numa próxima postagem sobre isso, vou explicar o Upload de Múltiplos Arquivos, porém antes vou explicar melhor os arrays e algumas de suas funções, e mais tarde o mesmo assunto utilizando AJAX.
<form action="" method="post" enctype="multipart/form-data">
<!--nesse input damos o nome MAX_FILE_SIZE e o Máximo de bits que ele pode ter do tipo hidden(oculto)-->
<input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
<!--nesse input damos o nome "arquivo" e o tipo de "file"-->
Arquivo: <input type="file" name="arquivo" /><br />
<input type="submit" name="enviar" /><br />
</form>
<?php
/*se clicarmos em Enviar Dados iniciaremos a leitura desse bloco*/
if(isset($_POST['enviar'])){
/* dê um var_dump($_FILES) ou print_r($_FILES) pra entender melhor essa parte, são os valores do array, nome, tipo, tamanho, erro, nome temporario...*/
$nome = $_FILES['arquivo']['name'];
$tipo = $_FILES['arquivo']['type'];
$tmp = $_FILES['arquivo']['tmp_name'];
$size = $_FILES['arquivo']['size'];
$erro = $_FILES['arquivo']['error'];
/* aqui definimos a pasta e/ou o caminho dela para que seja enviados os arquivos */
$caminho = '/uploads/';
/* o caminho mais o nome do aquivo para que possamos salvar o arquivo em determinada pasta */
$arquivocam = $caminho . $nome;
/* iremos decidir qual o tamanho máximo que permitiremos do arquivo */
$sizemax = 1024 * 1500;
/* informamos quais tipos de arquivo permitiremos */
$somente = array('image/jpg','text/plain','image/png');
/*pararemos a execução do bloco caso o tamanho seja execedido */
if($size > $sizemax){
die('Tamanho não permitido.');
}
/*pararemos a execução do bloco caso o tipo do arquivo não seja entre os permitido */
if(!array_search($tipo, $somente)){
die('tipo inválido.');
}
/* se a chave erro for igual a 0, entraremos nesse bloco */
if($erro == 0){
/* usamos a função move_upload_file para mover, se der certo, completaremos o processo */
if(move_uploaded_file($tmp, $arquivocam)){
echo "Foi carregado com sucesso o arquivo: $nome, do tipo: $tipo, com tamanho de: $size bytes!";
chmod($arquivocam,0777);
}
/* caso erro seja maior que zero, descobriremos qual foi o problemas, porém nesse caso é bom salvar os erros em outro lugar e mostrar somente um erro, por motivos de segurança */
}else{
switch($erro)
{
case 1: echo "Arquivo atingiu o tamanho máximo no PHP."; echo '<br />'; break;
case 2: echo "Arquivo atingiu o tamanho máximo no HTML.";echo '<br />'; break;
case 3: echo "Arquivo parcialmente carregado."; echo '<br />'; break;
case 4: echo "Erro: arquivo não carregado."; echo '<br />'; break;
}
}
}
?>