Você está na página 1de 16

Trabalhar com arquivos - Leitura

Introdução

De vez em quando é necessário ler, alterar ou criar arquivos no servidor de Internet, como por exemplo, para criar contadores de
acesso, estatísticas de visitas ou guardar algumas informações para visualizações posteriores que são demoradas para serem
criadas pelo servidor, e que não seria muito bom gerá-las sempre que um visitante as quisesse ver.

O PHP fornece um conjunto de funções muito boas para isto, e com alguns cuidados, os scripts funcionarão tanto em Windows
como em Linux sem nenhuma alteração. Todas essas funções podem ser encontradas no manual do php, em "Filesystem
functions".

Abrir arquivos

A primeira função que se deve conhecer para trabalhar com arquivos é a que cria uma ligação entre o script e o arquivo
propriamente dito:

int fopen( string arquivo, string modo [, int usa_include_path] );

Esta função devolve um ponteiro para um arquivo, que é utilizado noutras funções para lidar com arquivos. O primeiro
parâmetro, arquivo, é uma string que indica o local do arquivo a ser aberto, aqui vai a primeira dica: não utilize o modo de
referência do windows, como c:\www\arquivo.txt, pois não irá funcionar num servidor linux! Evite também ler e gravar arquivos
fora do directório onde o teu site está hospedado, às vezes torna-se difícil criar um directório fora do directório do site, e, se um
dia quiseres transferir o teu site para uma outra máquina, pode acontecer que te esqueças daquele directório isolado. Vamos
supor que o site tem um subdirectório "tmp" e que tem dentro um arquivo novidades.txt. Para abrir o arquivo usamos:

<?php
$fd = fopen( "tmp/novidades.txt", "r" );
...
?>

Note que mesmo que este script seja executado em windows ele irá funcionar. Excelente! Nada melhor que programar com uma
linguagem que funciona em vários sistemas operativos sem alterações!
O segundo parâmetro informa o PHP que o arquivo deve ser aberto so para leitura, os modos possíveis podem ser:

r - so leitura, coloca o ponteiro no início do arquivo


r+ - leitura e gravação, coloca o ponteiro no início do arquivo
w - so gravação, limpa o arquivo (deixa-o com 0 bytes) e coloca o ponteiro no início do arquivo. Se o arquivo não existir, tenta
criá-lo.
w+ - leitura e gravação, limpa o arquivo (deixa-o com 0 bytes) e coloca o ponteiro no início do arquivo. Se o arquivo não existir,
tenta criá-lo
a - so gravação, coloca o ponteiro no final do arquivo. Se o arquivo não existir, tenta criá-lo.
a+ - leitura e gravação, limpa o arquivo (deixa-o com 0 bytes) e coloca o ponteiro no final do arquivo. Se o arquivo não existir,
tenta criá-lo

Existe ainda a opção "b" que pode ser utilizada com os modos (sozinha não funciona!), esta opção indica que o arquivo deve ser
tratado como binário em vez de texto, ou seja, se o programa for lidar com imagens em vez de um arquivo de texto comum. É de
vital importância no windows para ler imagens, ou caso contrário o programa não irá funcionar. Como o Linux e Unix não fazem
diferença entre um arquivo de texto e um binário, essa opção não terá nenhum efeito, portanto, se o seu programa for trabalhar
com imagens, não custa nada adicionar esta opção. (programas multiplataforma são excelentes!)

AVISO: Como no windows (95/98/CE/ME) não existe permissão de acesso a arquivos os programas funcionarão como desejado,
podemos criar arquivos, acede-los, excluí-los e muito mais. No Linux começam a surgir alguns problemas, normalmente os
arquivos e directórios de um servidor de Internet são de um utilizador e o servidor http (apache, por exemplo) corre como um
outro utilizador, o php corre com o mesmo utilizador do servidor http, portanto se este utilizador não tiver permissão para gravar
num directório, não será possível criar os arquivos pelo php, nem alterá-los.

O terceiro parâmetro é opcional, e se seu valor for 1, o php irá procurar nos directórios informados na configuração
"include_path" do php.ini.

Se a função fopen falhar ao abrir ou ao criar o arquivo, ela retorna false. Note que se for utilizado o parâmetro "r"(somente
leitura) ou "r+" e o arquivo não existir, a função fopen não irá tentar criá-lo, simplesmente retornará um erro, e mostrará um
aviso no browser do utilizador.
Caso não seja muito bom mostrar esse tipo de erro para o utilizador (toda a gente que vir essa mensagem vai querer ler esse
arquivo directamente no browser), utilize o @ antes da função e confira o resultado:

<?php
$fd = @fopen( "tmp/novidades.txt", "r" ) or die( "ops, avise o webmaster, que está a faltar um arquivo no servidor");
...
?>

Mesmo que tenhas a certeza que este arquivo está por lá, usa este método, pois nem sempre as coisas são como esperamos.

Fechar arquivos

Depois de aberto ou criado o arquivo, é sempre bom deixar a mesa arrumada após o serviço, portanto devemos fechar o arquivo.
É muito fácil:

int fclose( int fp );

O parâmetro fp é o ponteiro de arquivo que foi retornado pela função fopen(), no nosso caso $fd. Esta função retorna true se o
arquivo foi fechado e false se não foi possível fechar o arquivo. O arquivo precisa ser fechado no mesmo script que o abriu.

O que fazer com os arquivos

Nem só de abrir e fechar arquivos vive um script php, é necessário fazer alguma coisa com eles. A "coisa" mais fácil é mostrar o
conteúdo do arquivo no browser do utilizador, para isso utilizamos a função "int fpassthru( int fp )". Então, para mostrar o
arquivo novidades.txt, que contém as últimas notícias da semana directamente para o browser do utilizador, o script fica assim:

<?php
$fd = @fopen( "tmp/novidades.txt", "r" ) or die( "ops, avise o webmaster, tem arquivo faltando no servidor");
fpassthru( $fd );
?>

A função fpassthru lê a partir da posição actual do ponteiro até ao final do arquivo e fecha o arquivo, portanto, neste caso não é
necessário utilizar a função fclose() (podes tentar, mas vai provocar um erro). Se estás a correr este script, notarás que o arquivo
novidades.txt saiu com as linhas juntas, para resolver isto coloca um <br> no final de cada linha do arquivo ou deixa o script
entre as tags <pre>. Se tentares colocar alguns scripts php dentro do arquivo novidades.txt notarás que eles serão mostrados no
browser do utilizador e não serão processados pelo php. Se quiseres adicionar um script php á página, utilza include ou require.
Se só for necessário mostrar o arquivo novidades directamente no browser sem precisar de posicionar o ponteiro, utiliza a função
readfile, que abre o arquivo, mostra e fecha o mesmo:

<?php
if( !@readfile( "tmp/novidades.txt") ) die ("ops, chame o webmaster!");
?>

Claro, existem muitas funções para ler o arquivo: (todas elas dependem do ponteiro do arquivo, e não do facto de fechar o
arquivo)
- string fread( int fp, int tamanho )

Lê o arquivo apartir da posição actual do ponteiro no arquivo até ao tamanho em bytes ou até o final do arquivo, o que acontecer
primeiro, e devolve como uma string.

<?php
// este script faz a mesma coisa que o anterior
if( $fd = @fopen( "tmp/novidades.txt", "r" ) ) {
while( !feof( $fd ) ) {
$novidades = fread( $fd, 1024 );
print $novidades;
}
fclose($fd);
}
?>

Enquanto não chegar ao final do arquivo ( feof() ), lê até 1024 bytes do arquivo para a variável $novidades e imprime seu
conteúdo.

- string fgetc( int fp )

Lê só um caractere do arquivo. Não utilize esta função para ler mais do que um caractere de um mesmo arquivo, não é eficiente,
é mais eficiente ler o arquivo em blocos para a memória e fazer o processamento na memória, pois o acesso ao disco é
extremamente lento se comparado com o acesso à memória, e aceder ao disco para ler um só caractere para processar é um
enorme disperdício de recursos do servidor. Tenta trocar a função fread pela fgetc no script acima e usa um arquivo novidades.txt
com alguns kbytes para perceberes a idéia. Imagina 10.000 hits/hora com um script desses!

- string fgets( int fp, int tamanho )

Se precisas de ler o arquivo linha á linha, utiliza esta função. Ela lê até que 1 byte seja lido, que encontre o final de uma linha
(que é incluída no resultado), ou final do arquivo e devolve como uma string. Para ler até 10 bytes de um arquivo, utilize:

$texto = fgets( $fd, 11 );

- string fgetss( int fp, int tamanho [, string tagspermitidas] )

Idêntica à função fgets, só que as tags html e php serão ignoradas. Se for necessário deixar algumas tags passarem pela função,
utilize o parâmetro opcional tags permitidas, por exemplo, para ler um arquivo novamente, mas deixar só as tags <br>,
<b></b> e <p></p> serem exibidas, use:

$texto = fgetss( $fd, 1024, "<br><b><p>" );

Mesmo podendo selecionar quais tags que podem passar pela função, se este arquivo vier de fora, ou seja, é um arquivo que
uma pessoa manda pela internet para mostra no site, alguém pode mandar algum código javascript malicioso dentro de uma tag,
e executar comandos indevidos na máquina do visitante do seu site. Cuidado!

array file( string arquivo [, int usa_include_path ] )

Lê o arquivo inteiro e coloca cada linha do arquivo numa tabela. Esta função utiliza como parâmetro o nome do arquivo, portanto
não é necessário abrir nem fechar o arquivo para usar esta função. Vamos ao exemplo:

Supondo que o arquivo novidades.txt tem uma novidade por linha, similar a este: novidade.txt
Nova versão do php acaba de ser lançada!
Linux eleito melhor sistema operativo do mundo!
*Encontrado mais um furo de segurança no dind.
O número de servidores linux cresce a cada dia!

Queremos mostrar cada linha do arquivo novidades com um fundo diferente, e ainda por cima as linhas que contém um * no
início devem ser exibidas em negrito

<html>
<head><title>Novidades</title></head>
<body>
<?php
$txt = @file("tmp/novidades.txt");
if(!$txt) {
print "Sem novidades por hoje, só o webmaster é que vai receber um responso";
exit;
}
// count retorna o número de índices da tabela
$tot = count($txt);
?>
<table width="500" align="center" bgcolor="white" cellpadding="1" cellspacing="0">
<?php
for($i=0;$i<$tot;$i++) {
// ct vai ler o primeiro caractere da linha
$ct=$txt[$i][0];
// Chop elimina espaços do final da string e finais de linha também
$linha = Chop($txt[$i]);
// Seleciona a cor de fundo para a linha
if( $cor == "#DCDCDC" ) $cor = "#DCDCFF";
else $cor = "#DCDCDC";
print "<tr><td bgcolor='$cor'>";
// strip_tags elimina todas as tags html e php, como fgetss
// se a linha começa com um *, le a partir do próximo caractere
// o ponto serve para concatenar as strings
if( $ct == "*" ) print "<b>".strip_tags(substr($linha,1))."</b>";
else print strip_tags($linha);
print "</td></tr>";
}
?>
</table>
</body>
</html>

Por hoje aprendemos várias funções de leitura de dados apartir de arquivos, em breve falaremos de funções de escrita.

Funções para tratamento de Strings

Funções relacionadas a HTML

htmlspecialchars

string htmlspecialchars(string str);

Devolve a string fornecida, substituindo os seguintes caracteres:


& para '&amp;'
" para '&quot;'
< para '&lt;'
> para '&gt;'

htmlentities

string htmlentities(string str);

Funciona de maneira semelhante ao comando anterior, mas de maneira mais completa, pois converte todos os caracteres da
string que possuem uma representação especial em html, como por exemplo:

º para '&ordm;'
ª para '&ordf;'
á para '&aacute;'
ç para '&ccedil;'

nl2br

string nl2br(string str);

Devolve a string fornecida substituindo todas as quebras de linha ("\n") por quebras de linhas em html ("<br>").

Exemplo:
echo nl2br("Mauricio\nVivas\n");

Imprime:
Maurício<br>Vivas<br>

get_meta_tags

array get_meta_tags(string arquivo);

Abre um arquivo html e percorre o cabeçalho em busca de "meta" tags, Devolvendo num array todos os valores encontrados.

Exemplo:
No arquivo teste.html temos:
...
<head>
<meta name="author" content="jose">
<meta name="tags" content="php3 documentation">
...
</head><!-- busca encerra aqui -->
...

a execução da função:

get_meta_tags("teste.html");

Devolve o array:

array("author"=>"jose","tags"=>"php3 documentation");
strip_tags

string strip_tags(string str);

Devolve a string fornecida, retirando todas as tags html e/ou PHP encontradas.

Exemplo:
strip_tags('<a href="teste1.php3">testando</a><br>');

Devolve a string "testando"

urlencode

string urlencode(string str);

Devolve a string fornecida, convertida para o formato urlencode. Esta função é útil para passar variáveis para uma próxima
página.

urldecode

string urldecode(string str);

Funciona de maneira inversa a urlencode, desta vez decodificando a string fornecida do formato urlencode para texto normal.

Funções relacionadas a arrays

Implode e join

string implode(string separador, array partes);


string join(string separador, array partes);

As duas funções são idênticas. Devolvem uma string contendo todos os elementos do array fornecido separados pela string
também fornecida.

Exemplo:
$partes = array("a", "casa número", 13, "é azul");
$inteiro = join(" ",$partes);

$inteiro passa a conter a string:


"a casa número 13 é azul"

split

array split(string padrao, string str, int [limite]);

Devolve um array contendo partes da string fornecida separadas pelo padrão fornecido, podendo limitar o número de elementos
do array.
Exemplo:
$data = "11/14/1975";
$data_array = split("/",$data);

O código acima faz com que a variável $data_array receba o valor:


array(11,14,1975);

explode

array explode(string padrao, string str);

Funciona de maneira bastante semelhante à função split, com a diferença que não é possível estabelecer um limite para o
número de elementos do array.

Comparações entre strings

similar_text

int similar_text(string str1, string str2, double [porcentagem]);

Compara as duas strings fornecidas e devolve o número de caracteres coincidentes. Opcionalmente pode ser fornecida uma
variável, passada por referência (ver tópico sobre funções), que receberá o valor percentual de igualdade entre as strings. Esta
função é case sensitive, ou seja, maiúsculas e minúsculas são tratadas como diferentes.

Exemplo:

$num = similar_text("teste", "testando",&$porc);

As variáveis passam a ter os seguintes valores:

$num == 4; $porc == 61.538461538462

strcasecmp

int strcasecmp(string str1, string str2);

Compara as duas strings e Devolve 0 (zero) se forem iguais, um valor maior que zero se str1 > str2, e um valor menor que zero
se str1 < str2. Esta função é case insensitive, ou seja, maiúsculas e minúsculas são tratadas como iguais.

strcmp

int strcasecmp(string str1, string str2);

Funciona de maneira semelhante à função strcasecmp, com a diferença que esta é case sensitive, ou seja, maiúsculas e
minúsculas são tratadas como diferentes.

strstr

string strstr(string str1, string str2);


string strchr(string str1, string str2);
As duas funções são idênticas. Procura a primeira ocorrência de str2 em str1. Se não encontrar, Devolve uma string vazia, e se
encontrar Devolve todos os caracteres de str1 a partir desse ponto.

Exemplo:
strstr("Mauricio Vivas", "Viv"); // Devolve "Vivas"

stristr

string strstr(string str1, string str2);

Funciona de maneira semelhante à função strstr, com a diferença que esta é case insensitive, ou seja, maiúsculas e minúsculas
são tratadas como iguais.

strpos

int strpos(string str1, string str2, int [offset] );

Devolve a posição da primeira ocorrência de str2 em str1, ou zero se não houver. O parâmetro opcional offset determina a partir
de qual caracter de str1 será efetuada a busca. Mesmo utilizando o offset, o valor de retorno é referente ao início de str1.

strrpos

int strrpos(string haystack, char needle);

Devolve a posição da última ocorrência de str2 em str1, ou zero se não houver.

Funções para edição de strings

chop

string chop(string str);

Retira espaços e linhas em branco do final da string fornecida.

Exemplo:
chop(" Teste \n \n "); // Devolve " Teste"

ltrim

string ltrim(string str);

Retira espaços e linhas em branco do final da string fornecida.

Exemplo:
ltrim(" Teste \n \n "); // Devolve "Teste \n \n"

trim

string trim(string str);

Retira espaços e linhas em branco do início e do final da string fornecida.


Exemplo:
trim(" Teste \n \n "); // Devolve "Teste"

strrev

string strrev(string str);

Devolve a string fornecida invertida.

Exemplo:
trrev("Teste"); // Devolve "etseT"

strtolower

string strtolower(string str);

Devolve a string fornecida com todas as letras minúsculas.

Exemplo:
strtolower("Teste"); // Devolve "teste"

strtoupper

string strtoupper(string str);

Devolve a string fornecida com todas as letras maiúsculas.

Exemplo:
strtolower("Teste"); // Devolve "TESTE"

ucfirst

string ucfirst(string str);

Devolve a string fornecida com o primeiro caracter convertido para letra maiúscula.

Exemplo:
ucfirst("teste de funcao"); // Devolve "Teste de funcao"

ucwords

string ucwords(string str);

Devolve a string fornecida com todas as palavras iniciadas por letras maiúsculas.

Exemplo:
ucwords("teste de funcao"); // Devolve "Teste De Funcao"

str_replace
string str_replace(string str1, string str2, string str3);
Altera todas as ocorrências de str1 em str3 pela string str2.

Funções diversas

chr

string chr(int ascii);

Devolve o caracter correspondente ao código ASCII fornecido.

ord

int ord(string string);

Devolve o código ASCII correspontente ao caracter fornecido.

echo

echo(string arg1, string [argn]... );

Imprime os argumentos fornecidos.

print

print(string arg);

Imprime o argumento fornecido.

strlen
int strlen(string str);

Devolve o tamanho da string fornecida.

Funções para tratamento de Arrays

Funções Genéricas

Array

array array(...);

É a função que cria um array a partir dos parâmetros fornecidos. É possível fornecer o índice de cada elemento. Esse índice pode
ser um valor de qualquer tipo, e não apenas de inteiro. Se o índice não for fornecido o PHP atribui um valor inteiro seqüencial, a
partir do 0 ou do último índice inteiro explicitado. Vejamos alguns exemplos:

Exemplo 1
$teste = array("um", "dois","tr"=>"tres",5=>"quatro","cinco");

Temos o seguinte mapeamento:


0 => "um" (0 é o primeiro índice, se não houver um explicito)
1 => "dois" (o inteiro seguinte)
"tr" => "tres"
5 => "quatro" (valor explicitado)
6 => "cinco" (o inteiro seguinte ao último atribuído, e não o próximo valor, que seria 2)

Exemplo 2
$teste = array("um", 6=>"dois","tr"=>"tres",5=>"quatro","cinco");

Temos o seguinte mapeamento:


0 => "um"
6 => "dois"
"tr" => tres
5 => "quatro" (seria 7, se não fosse explicitado)
7 => "cinco" (seria 6, se não estivesse ocupado)

Em geral, não é recomendável utilizar arrays com vários tipos de índices, já que isso pode confundir o programador. No caso de
realmente haver a necessidade de utilizar esse recurso, deve-se ter bastante atenção ao manipular os índices do array.

range

array range(int minimo, int maximo);

A função range cria um array cujos elementos são os inteiros pertencentes ao intervalo fornecido, inclusive. Se o valor do
primeiro parâmetro for maior do que o do segundo, a função Devolve false (valor vazio).

shuffle

void shuffle(array &arr);

Esta função "embaralha" o array, ou seja, troca as posições dos elementos aleatoriamente e não Devolve valor algum.

sizeof

int sizeof(array arr);

Devolve um valor inteiro contendo o número de elementos de um array. Se for utilizada com uma variável cujo valor não é do
tipo array, Devolve 1. Se a variável não estiver setada ou for um array vazio, Devolve 0.

Funções de "navegação"

Toda variável do tipo array possui um ponteiro interno indicando o próximo elemento a ser acedido no caso de não ser
especificado um índice. As funções seguintes servem para modificar esse ponteiro, permitindo assim percorrer um array para
verificar seu conteúdo (chaves e elementos).

reset

mixed reset(array arr);

O ponteiro interno aponta para o primeiro elemento do array, e devolve o conteúdo desse elemento.

end

mixed end(array arr);


O ponteiro interno aponta para o último elemento do array, e devolve o conteúdo desse elemento.

next

mixed next(array arr);

O ponteiro interno aponta para o próximo elemento do array, e devolve o conteúdo desse elemento.

Obs.: esta não é uma boa função para determinar se um elemento é o último do array, pois pode devolver false tanto no final do
array como no caso de haver um elemento vazio.

prev

mixed prev(array arr);

O ponteiro interno aponta para o elemento anterior do array, e devolve o conteúdo desse elemento. Funciona de maneira inversa
a next.

pos

mixed pos(array arr);

Devolve o conteúdo do elemento actual do array, indicado pelo ponteiro interno.

key

mixed key(array arr);

Funciona de maneira bastante semelhante a pos, mas em vez de devolver o elemento actual indicado pelo ponteiro interno do
array, devolve o seu índice.

each

array each(array arr);

Devolve um array contendo o índice e o elemento actual indicado pelo ponteiro interno do array. o valor da devolução é um array
de quatro elementos, cujos índices são 0, 1, "key" e "value". Os elementos de índices 0 e "key" armazenam o índice do valor
atual, e os elementos de índices 1 e "value" contém o valor do elemento atual indicado pelo ponteiro.
Esta função pode ser utilizada para percorrer todos os elementos de um array e determinar se já foi encontrado o último
elemento, pois no caso de haver um elemento vazio, a função não devolverá o valor false. A função each só devolve false depois
q o último elemento do array foi encontrado.

Exemplo:

função que percorre todos os elementos de um array e imprime seus índices e valores

function imprime_array($arr) {
reset($arr);
while (list($chave,$valor) = each($arr))
echo "Chave: $chave. Valor: $valor";
}
Funções de ordenação

São funções que servem para ordenar os elementos de um array de acordo com determinados critérios. Estes critérios são:
manutenção ou não da associação entre índices e elementos; ordenação por elementos ou por índices; função de comparação
entre dois elementos.

sort

void sort(array &arr);

A função mais simples de ordenação de arrays. Ordena os elementos de um array em ordem crescente, sem manter os
relacionamentos com os índices.

rsort

void rsort(array &arr);

Funciona de maneira inversa à função sort. Ordena os elementos de um array em ordem decrescente, sem os manter os
relacionamentos com os índices.

asort

void asort(array &arr);

Tem o funcionamento bastante semelhante à função sort. Ordena os elementos de um array em ordem crescente, porém mantém
os relacionamentos com os índices.

arsort

void arsort(array &arr);

Funciona de maneira inversa à função asort. Ordena os elementos de um array em ordem decrescente e mantém os
relacionamentos dos elementos com os índices.

ksort

void ksort(array &arr);

Função de ordenação baseada nos índices. Ordena os elementos de um array de acordo com seus índices, em ordem crescente,
mantendo os relacionamentos.

usort

void usort(array &arr, function compara);

Esta é uma função que utiliza outra função como parâmetro. Ordena os elementos de um array sem manter os relacionamentos
com os índices, e utiliza para efeito de comparação uma função definida pelo utilizador, que deve comparar dois elementos do
array e devolver 0, 1 ou -1, de acordo com qualquer critério estabelecido pelo utilizador.

uasort

void uasort(array &arr, function compara);


Esta função também utiliza outra função como parâmetro. Ordena os elementos de um array e mantém os relacionamentos com
os índices, utilizando para efeito de comparação uma função definida pelo utilizador, que deve comparar dois elementos do array
e devolver 0, 1 ou -1, de acordo com qualquer critério estabelecido pelo utilizador.

uksort

void uksort(array &arr, function compara);

Esta função ordena o array através dos índices, mantendo os relacionamentos com os elementos., e utiliza para efeito de
comparação uma função definida pelo utilizador, que deve comparar dois índices do array e devolver 0, 1 ou -1, de acordo com
qualquer critério estabelecido pelo utilizador.

Enviar um arquivo para o servidor

O PHP suporta várias funcionalidades, por isso o seu grande sucesso entre os programadores que procuram facilidade de
programação, suporta bases de dados,
corre independentemente do sistema operativo utilizado e hardware, entre outros.

Dentro das funcionalidades do PHP está o suporte para o envio de arquivos para o servidor através de um formulário HTML.
Qualquer tipo de arquivo pode ser enviado para o servidor, seja ele uma imagem, um arquivo de texto, uma base de dados, etc.,
ou melhor, seja o arquivo binário ou texto.

Para enviar um arquivo, primeiro precisamos criar um formulário para o utilizador indicar qual o arquivo que deseja enviar:

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


<input type="file" name="arquivo">
<input type="submit" name="submit" value="Enviar arquivo">
</form>

ATENÇÃO: O parâmetro "enctype" é obrigatório, sem ele não é possível enviar o arquivo para o servidor!

Para o php aceitar o arquivo, alguns parâmetros devem estar configurados correctamente no php:

file_uploads = On - O PHP aceita o envio de arquivo;

upload_tmp_dir = - Qual o directório que onde o php guardará "temporariamente" o arquivo enviado.

upload_max_filesize = 2M - Tamanho máximo do arquivo aceito pelo php

Normalmente o PHP já vem configurado para aceitar o upload de arquivos, mas é sempre bom verificar a sua configuração no
php.ini para não ter mais tarde dores de cabeça.

Além do limite de tamanho do arquivo imposto pela configuração do php (que serve para todos os scripts do servidor) podemos
também limitar o tamanho utilizando uma configuração do formulário:

<input type="hidden" name="MAX_FILE_SIZE\" value="1024">

Neste caso estamos a limitar o tamanho máximo do arquivo em 1024 bytes. Mas não é recomendável confiar neste parâmetro,
pois qualquer pessoa com algum conhecimento de HTML conseguirá retirar este limite. Mais abaixo mostrarei outra solução para
isto.

Tudo bem, o utilizador selecionou o arquivo para ser enviado e pressionou o botão "Enviar arquivo", se crias-te um arquivo com o
formulário acima e um arquivo "teste.php" (pode ser o mesmo arquivo do formulário) o browser do utilizador irá enviar o arquivo
para o servidor, e nada vai acontecer, além do php ter guardado o arquivo no directório temporário e apagado o arquivo no final
da execução do script. Então teremos que fazer mais qualquer coisa com o arquivo. Após receber o arquivo, o php guarda-o num
directório temporário, com um nome escolhido por ele, e criará várias variáveis globais com informações deste arquivo, baseadas
no nome que escolhemos para o campo, no nosso caso "arquivo":

$arquivo : nome do arquivo, com seu caminho absoluto, onde o php o guardou
$arquivo_name : nome do arquivo, absoluto, na máquina do utilizador
$arquivo_size : tamanho em bytes do arquivo
$arquivo_type : tipo "MIME" do arquivo

Com essas variáveis podemos agora fazer qualquer coisa com o arquivo. Podemos, por exemplo, verificar se o arquivo tem um
tamanho abaixo do limite maximo desejado para ser enviado (isto é muito importante, pois impossibilita que alguém envie um
arquivo tão grande que possa bloquear o servidor). Usamos o seguinte script:

<?php
if($arquivo_size > 1024) {
print "O tamanho do arquivo é maior do que o limite permitido<br>";
exit;
}
?>

Para não deixar alguns utilizadores irritados, podemos usar as duas opções juntas, o limite configurado dentro do formulário e o
limite dentro do script, assim os utilizadores normais não terão a decepção de esperar vários minutos para enviar o arquivo para
o servidor e só depois serem avisados que o arquivo era grande demais, assim o browser acusa o tamanho demasiado grande
antes de enviar o arquivo, e os utilizadores "espertinhos" terão uma decepção ao descobrir que existia outra limitação.

Precisamos agora fazer alguma coisa com o arquivo antes de terminar o script, senão o php irá apagá-lo. Temos o nome do
arquivo na váriavel "arquivo", então precisamos colocá-lo num lugar do servidor. Podemos usar a função do php "copy". A função
copy exige 2 parâmetros: fonte e destino, e retorna verdadeiro ou falso, ou seja, se copiou ou não. Atenção para quem vai usar
este método num sistema Linux, unix ou qualquer outro que tenha suporte para permissões de arquivos, pois a função "copy" irá
executar uma cópia do arquivo como o utilizador que executa o servidor, portanto, se o utilizador/grupo que executa o servidor
não tiver permissão de escrita no directório de destino, não vai ser possível copiar o arquivo para lá. Neste caso, tente gravar no
/tmp, que costuma ter permissão de escrita para todos os utilizadores, ou dê a permissão a um directório específico só para
gravar os arquivos. Supondo que o servidor tem permissão de escrita no subdirectório arquivo do directório do nosso script,
vamos gravar:

<?php
....
if(copy($arquivo,"arquivo/arquivo_do_utilizador")) {
print "O arquivo foi recebido com êxito!<br>";
} else {
print "Ocorreu um erro ao receber o arquivo!<br>";
}
?>

Pronto, agora o arquivo foi salvo como arquivo_do_utilizador no subdiretório arquivo. Note que todos os utilizadors que enviarem
o arquivo para o servidor terão os seus arquivo salvos com o mesmo nome, portanto, só um arquivo irá existir, e será o arquivo
do último utilizador que enviou o arquivo.

Fica para o leitor o exercício de criar um arquivo único para cada utilizador e que um mesmo utilizador não consiga enviar mais
do que três arquivos por login.

Em breve haverá um tutorial que explicará como fazer isto


Até a próxima!

Varrendo Diretórios

Este artigo mostra como varrer diretórios possuindo um filtro, muito útil para pesquisa em cadeias... Serve também como procura de arquivos em diretórios.

O script é uma função para mais tarde podermos chamá-la a qualquer hora.

Crie uma página chamada varre.php e transcreva o script abaixo:

<?php
function varre($dir,$filtro="",$nivel="")
{
$diraberto = opendir($dir); // Abre o diretorio especificado
chdir($dir); // Muda o diretorio atual p/ o especificado
while($arq = readdir($diraberto)) { // Le o conteudo do arquivo
if($arq == ".." || $arq == ".")continue; // Desconsidera os diretorios
$arr_ext = explode(";",$filtro);
foreach($arr_ext as $ext) {
$extpos = (strtolower(substr($arq,strlen($arq)-strlen($ext)))) == strtolower($ext);
if ($extpos == strlen($arq) and is_file($arq)) // Verifica se o arquivo é igual ao filtro
echo $nivel.$arq."<br>"; // Imprimi em forma de arvore
}
if (is_dir($arq)) {
echo $nivel.$arq."<br>"; // Imprimi em forma de arvore
varre($arq,$filtro,$nivel."&nbsp;&nbsp;&nbsp;&nbsp;"); // Executa a funcao novamente se
subdiretorio
}
}
chdir(".."); // Volta um diretorio
closedir($diraberto); // Fecha o diretorio atual
}
?>

Exemplo1

Crie a página verrendo.php e insira o código abaixo:

<?php
include("varre.php");
varre("."); // Executa a funcao com o caminho especificado, no caso o diretorio do onde esta o arquivo
?>

Exemplo2

Crie a página verrendo2.php e insira o código abaixo:

<?php
include("varre.php");
varre(".",".txt"); // Verifica arquivos .txt
?>

Exemplo3

Crie a página verrendo3.php e insira o código abaixo:

<?php
include("varre.php");
varre(".",".txt;passwd"); // Verifica arquivos .txt ou com nome passwd
?>

A função pode ser chamada com ou sem filtros - sem filtros será listado todo o conteúdo do diretório especificado e os seus sub-
diretórios.

Lembre-se que este script funciona tanto em servidores Windows como Linux.