Upload de arquivos no PHP

Com o PHP é possível enviar aquivos para o servidor (upload).

Criando um formulário para upload

Para que os usuários possam enviar arquivos para o servidor o uso de um formulário não é a única forma mas é a mais simples

Veja o formulário a seguir para o upload de arquivos:
   1:<html>
2:<body>
3:<form action="upload_file.php" method="post" enctype="multipart/form-data">
4:<label for="file">Arquivo:</label>
5:<input type="file" name="file" id="file" />
6:<br />
7:<input type="submit" name="submit" value="Enviar" />
8:</form>
9:</body>
10:</html>

Perceba o seguinte sobre o formulário acima:

O atributo enctype da tag <form> especifica que tipo de conteúdo (content-type) usar quando o formulário é enviado. O tipo "multipart/form-data" é usado quando quando o formulário envia dados binários como o conteúdo de um arquivo.

O atributo type="file" da tag <input> especifica que o campo deve ser do tipo seletor de arquivo e que o conteúdo do campo deve ser tratado como um arquivo. Por exemplo quando visto em um browser haverá um botão de pesquisa de arquivo próximo ao campo.

Nota: Permitir que os usuários enviem arquivos para o servidor é um grande risco de segurança. É importante permitir que apenas usuários confiáveis possam fazer isso.

Criando o arquivo PHP

O arquivo "upload_file.php" contém o código que recebe o arquivo enviado:
   1:<?php
2:if ($_FILES["file"]["error"] > 0) {
3: echo "Erro: ".
4: $_FILES["file"]["error"] . "<br />";
5:}
6:else {
7: echo "Arquivo enviado: ".
8: $_FILES["file"]["name"] . "<br />";
9: echo "Tipo: ".
10: $_FILES["file"]["type"]."<br />";
11: echo "Tamanho: ".
12: ($_FILES["file"]["size"] / 1024) .
13: " Kb<br />";
14: echo "Guardado em: ".
15: $_FILES["file"]["tmp_name"];
16:}
17:?>


Usando o array $_FILES você pode acessar os arquivos enviados de um computador cliente para o servidor.

A primeira chave do array é o nome do input (type = "file") no formulário que enviou o arquivo. A segunda chave pode ser tanto "name", "type", "size", "tmp_name" ou "error". Desta forma:

$_FILES["file"]["name"] - O nome do arquivo enviado.
$_FILES["file"]["type"] - O tipo do arquivo enviado.
$_FILES["file"]["size"] - O tamanho em bytes do arquivo enviado.
$_FILES["file"]["tmp_name"] - O nome da cópia temporária do arquivo guardada no servidor.
$_FILES["file"]["error"] - O código de erro que foi gerado durante o processo de envio.

Esta é uma forma bem simples de envio de arquivos. Por questões de segurança, você deve criar restrições sobre o que o usuário é permitido a enviar.

Restrições no Upload

Neste script nos vamos adicionar algumas restrições ao arquivo a ser enviado. O usuário poderá enviar apenas arquivos dos tipos .gif ou .jpeg e o tamanho do arquivo deverá ser menor que 20kb.
   1:<?php
2:if ((($_FILES["file"]["type"] == "image/gif")
3: || ($_FILES["file"]["type"] == "image/jpeg")
4: || ($_FILES["file"]["type"] == "image/pjpeg"))
5: && ($_FILES["file"]["size"] < 20000)) {
6:
7: if ($_FILES["file"]["error"] > 0) {
8: echo "Erro: ".
9: $_FILES["file"]["error"].
10: "<br />";
11: }
12: else {
13: echo "Arquivo enviado: ".
14: $_FILES["file"]["name"]."<br />";
15: echo "Tipo: ".
16: $_FILES["file"]["type"]."<br />";
17: echo "Tamanho: ".
18: ($_FILES["file"]["size"] / 1024).
19: " Kb<br />";
20: echo "Guardado em: ".
21: $_FILES["file"]["tmp_name"];
22: }
23:}
24:else {
25: echo "Arquivo inválido";
26:}
27:?>

Nota: Os arquivos jpg enviados pelo Internet Explorer são do tipo pjpeg e os enviados pelo FireFox são do tipo jpeg.

Salvando o arquivo enviado

Os exemplos acima usam a cópia temporária do arquivo enviado, criado pelo próprio servidor na pasta temporária do PHP no servidor.

Estes arquivos desaparecem assim que o script termina sua execução. Para guardar o arquivo enviado em uma localidade diferente:
   1:<?php
2:if ((($_FILES["file"]["type"] == "image/gif")
3: || ($_FILES["file"]["type"] == "image/jpeg")
4: || ($_FILES["file"]["type"] == "image/pjpeg"))
5: && ($_FILES["file"]["size"] < 20000)) {
6:
7: if ($_FILES["file"]["error"] > 0) {
8: echo "Código de retorno: ".
9: $_FILES["file"]["error"].
10: "<br />";
11: }
12: else {
13: echo "Arquivo: "
14: .$_FILES["file"]["name"]."<br />";
15: echo "Tipo: ".
16: $_FILES["file"]["type"]."<br />";
17: echo "Tamanho: ".
18: ($_FILES["file"]["size"] / 1024).
19: " Kb<br />";
20: echo "Arquivo temporário: ".
21: $_FILES["file"]["tmp_name"]."<br />";
22:
23: if (file_exists("upload/"
24: .$_FILES["file"]["name"])){
25: echo $_FILES["file"]["name"]
26: ." existe.";
27: }
28: else {
29: move_uploaded_file(
30: $_FILES["file"]["tmp_name"],
31: "upload/".$_FILES["file"]["name"]);
32:
33: echo "Guardado em: upload/".
34: $_FILES["file"]["name"];
35: }
36: }
37:}
38:else {
39: echo "Invalid file";
40:}
41:?>
O script acima checa se o arquivo já existe. Se não existe ele copia o arquivo para a pasta especificada.

Nota: este script salva o arquivo em uma nova pasta chamada "upload".

9 comentários:

  1. Olá Thiago!

    Hoje de manhã conclui esta aula, estou avançando sem parar.

    Abraços!!!

    ResponderExcluir
  2. kara tenho que saber pra mim esses codigos ou posso copiar e quando precisa eu uso ele ? ou tenho que ter ele de cabeça ?

    ResponderExcluir
  3. Rafael, acho que o que você tem que saber mesmo é que o código para fazer o que você quer existe, como procurar por ele (nome, ou outro tipo de referencia), e como ele funciona porque em geral o que você vai precisar é de fazer as coisas funcionarem. A não ser que você tenha que provar que sabe para alguma coisa tipo prova ou concurso, mas ainda assim, eu diria para você se concentrar em entender como funciona.

    ResponderExcluir
  4. Thiago, qual é o scrip q quando eu envio uma imagem pra aparecer em um certo lugar? tipo assim, eu envio uma imagem, ai eu quero q aparece em um certo lugar na minha ´pagina. obrigado, se quizer me add no msn é jhonatan.victor@hotmail.com

    ResponderExcluir
  5. Então, acredito que a forma como você vai fazer um upload de imagem e mostrar na sua página vai depender de vários fatores, mas provavelmente a forma mais simples de se fazer isso é copiar o arquivo temporário $_FILES["file"]["tmp_name"] para uma pasta ou banco de dados onde ele ficará armazenado permanentemente. Depois, para mostrar a imagem você deve ter o diretório permanente acessível por meio de uma url ou ter um script que abre o arquivo no local permanente o envia para a página.

    ResponderExcluir
  6. quando envio a imagem logo apos ser redimensinada ,ela chega no tamanho cropiada mas tudo preto

    ResponderExcluir
    Respostas
    1. Não seria um problema com o redimensionamento? Verifique se esta utilizando corretamente a API e teste o redimensionamento separadamente do upload (fornecendo um arquivo fixo no servidor).

      Excluir
  7. Nossa!!! Parabéns, está ficando altamente técnica a publicação. Tenho de me dedicar com mais atenção e fazer as pesquisar sugeridas.
    Abraços.

    ResponderExcluir