sexta-feira, 11 de outubro de 2013

Envio de Arquivo com PHP

Envio de Arquivo com PHP


Bom dia, caros amigos e alunos.

Ontem o Julian pediu uma ajuda de como fazer upload de arquivo para o site. Bem, estarei mostrando aqui como fazer isso.

No lado do cliente

No navegador teremos que ter na página web um form com um campo que especifique que se trata de um arquivo. Isso é feito com uma tag input com tipo file. Veja o exemplo.


<form id="frmEnviaArq" name="frmEnviaArq" method="post" action="gravaarq.php" enctype="multipart/form-data" >
    <input id="nmArq" name="nmArq" type="file" size="25" maxlength="150"/>
    <input id="btnEnviar" name="btnEnviar" type="Submit" value="Enviar"/>
<form>

O nome do objeto é nmArq com tamanho 25 e o limite de caracteres é 150.

Ao se clicar no botão o navegador irá requisitar o documento gravaarq.php ao servidor e enviará o arquivo para o mesmo quando ele disser que está pronto para receber.


No lado do servidor

Antes de tudo é muito importante vocês saberem que o PHP limita o tamanho do arquivo permitido para upload. Verifique no arquivo PHP.INI, que está no local onde o PHP foi instalado. Procure por UPLOAD_MAX_FILESIZE e altere o tamanho máximo para sua conviniência, ou se preferir você poderá alterar pelo seu código PHP com a função ini_set.

A função ini_set substitui os valores padrões das variáveis definidas no arquivo PHP.ini para seu programa.

Veja o exemplo abaixo.

<?php

    // Alterando o tamanho máximo do arquivo para 5Megabytes
    ini_set('upload_max_filesize','5MB');

?>

Agora precisamos receber o arquivo.

Nós usaremos o array global $_FILES para pegar o nome do arquivo. Para isso precisamos passar duas chaves para o array, uma é o nome do objeto do form que tem o nome do arquivo, a segunda é o que queremos saber do arquivo.

Assim:

$arquivo = $_FILES['nmArq']['name'];

A string 'nmArq' é o nome do objeto no form e string 'name' indica que você quer saber o nome, não passe para o português.

Após a execução da linha acima a variável $arquivo terá o nome do arquivo que foi enviado. Se existirem vários campos do tipo arquivo no form $_FILES terá várias linhas com nomes diferentes dos arquivos. Eles poderão ser lidos com um loop foreach.

Você também poderá pegar o tipo de arquivo que foi enviado para fazer testes com:

$tipo = $_FILES['nmArq']['type'];

A string 'nmArq' é o nome do objeto no form e string 'type' indica que você quer saber o tipo, não passe para o português.

Agora teremos que usar a função move_uploaded_file para colocarmos nosso arquivo no lugar certo. Essa função retorna false caso falhe.

Essa função usa dois parâmetros. O primeiro é o nome temporário que foi usado para a realização do upload. Isso porque quando o arquivo é enviado para o servidor ele não fica com o nome original. O segundo é o diretório com nome que desejamos.

É de boa prática não deixarmos qualquer arquivo ir para o servidor. Sempre devemos verificar se o tipo do arquivo é um dos tipos permitidos. Para fim de didática não irei fazer essa crítica, mas em uma postagem próxima eu farei isso com vocês.

$nome_temp = $_FILES['nmArq']['tmp_name'];

A string 'nmArq' é o nome do objeto no form e string 'tmp_file' indica que você quer saber o nome do arquivo temporário, não passe para o português.

A única coisa que faremos mesmo é passar o nome do arquivo para minúsculo e acrescentar o diretório para onde queremos que o arquivo vá no nosso servidor. Vale lembrar que esse diretório precisa ter o atributo de escrita permitido.

$arqDestinostrtolower('/diretorio_de_arquivos/'.$arquivo);

Agora fazemos a movimentação do arquivo recebido.

move_uploaded_file($nome_temp$arqDestino);

O código completo está abaixo, volto a lembrar que ele é muito básico por questões didáticas, em um outro exemplo farei o código mais detalhado.


<?php

    // Alterando o tamanho máximo do arquivo para 5Megabytes
    ini_set('upload_max_filesize','5MB');

    // Pega o nome do aqruivo
    $arquivo = $_FILES['nmArq']['name'];

    // Define diretório e nome final do arquivo servidor
    // strtolower coloca em minúsculo
    $arqDestino = strtolower('/diretorio_de_arquivos/'.$arquivo);

    // Pega o nome do arquivo temporário usado no servidor
    $nome_temp = $_FILES['nmArq']['tmp_name'];

    // Move arquivo temporário para o diretório e nome corretos
    if (!move_uploaded_file($nome_temp$arqDestino) ) {
       // Erro ao mover arquivo
       echo ("<b>Erro de upload do arquivo.</b>");
    }

?>

Por enquanto é só pessoal, já dizia o Pernalonga.

Abraço.

Joselmo Carvalho








Nenhum comentário:

Postar um comentário