Olá pessoal! Há algumas semanas atrás estava desenvolvendo um sistema onde o cliente solicitou que além do seu site institucional tivesse também uma área restrita onde ele pudesse disponibilizar documentos digitais para seus clientes. Resumindo, cada cliente teria um espaço virtual com documentos e outros arquivos importantes e acessaria tudo com seu usuário/senha.
Pois bem. Quando o sistema é acessado, é listado para aquele usuário todos os arquivos que estão disponíveis para ele. E nessa lista é mostrado o nome do documento, o seu formato, a data de envio, uma breve descrição do que se trata e o tamanho do arquivo já que, obviamente, o cliente tem a opção de fazer o download.
Tive que quebrar a cabeça um pouco para resolver essa questão do tamanho do arquivo. O php oferece uma função nativa ( filesize($arquivo) ) que retorna o tamanho de um arquivo, porém em bytes. E eu queria algo que mostrasse o valor já formatado com sua unidade de medida (KB, MB, GB, TB etc.).
Foi então que implementei a seguinte função que realiza essa tarefa. Vejam:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php /** * Retorna o tamanho de um determinado arquivo em KB, MB, GB TB, etc * @author Rafael Wendel Pinheiro * @param String $arquivo O arquivo a ser verificado * @return String O tamanho do arquivo (já formatado) */ function tamanho_arquivo($arquivo) { $tamanhoarquivo = filesize($arquivo); /* Medidas */ $medidas = array('KB', 'MB', 'GB', 'TB'); /* Se for menor que 1KB arredonda para 1KB */ if($tamanhoarquivo < 999){ $tamanhoarquivo = 1000; } for ($i = 0; $tamanhoarquivo > 999; $i++){ $tamanhoarquivo /= 1024; } return round($tamanhoarquivo) . $medidas[$i - 1]; } |
Note que devo passar como parâmetro o (caminho) arquivo que desejo saber o tamanho. Pela função nativa filesize eu capturo o tamanho em bytes do arquivo. Crio um array com as unidades de medidas (KB, MB, GB e TB – dificilmente terão arquivos acima dos TBs, mas fique a vontade para incluir outras medidas). Defino uma regra que todos os arquivos com menos de 1KB terão seu tamanho arredondado para 1KB. Depois percorro um laço para dividir o retorno do filesize (em bytes) para a nova unidade. Enquanto o tamanho do arquivo for maior que 999 bytes ele será dividido por 1024 (1024 bytes = 1KB; 1024KBs = 1MB e assim por diante). E por fim utilizo a função round para arredondar o valor e concateno a unidade de medida me baseando no valor do índice do laço de repetição ($i).
Para usar a função é fácil. Veja:
1 2 3 4 5 6 | echo tamanho_arquivo('foto1.jpg'); /* Retorna 670KB */ echo tamanho_arquivo('musica1.mp3'); /* Retorna 5MB */ |
E ponto final.
Espero que essa função os ajudem tanto quanto me ajudou.
Abs!
Não é a toa que acompanho suas matérias…Ótimo aprendizado…Parabéns…
Estou com problema… usei o seu código e mão deu certo.
Como estou fazendo:
209 function tamanho_arquivo($arquivo) {
210 $tamanhoarquivo = filesize($arquivo);
211 /* Medidas */
212 $medidas = array(‘KB’, ‘MB’, ‘GB’, ‘TB’);
213 /* Se for menor que 1KB arredonda para 1KB */
214 if($tamanhoarquivo 999; $i++){
218 $tamanhoarquivo /= 1024;
219 }
220 return round($tamanhoarquivo) . $medidas[$i – 1];
221 }
222
223 $fotoP = $row_foto_eventos[‘Foto’];
224 /* Retorna */
225 echo tamanho_arquivo(‘$fotoP’);
ERRO:
Warning: filesize() [function.filesize]: stat failed for $fotoP in C:\wamp\www\site\admin\_fotos.php on line 210
1KB
Fatal error: Cannot redeclare tamanho_arquivo() (previously declared in C:\wamp\www\site\admin\_fotos.php:209) in C:\wamp\www\site\admin\_fotos.php on line 209
Olá Ronaldo,
O fatal error está dizendo que a função foi implementada duas vezes (uma nesse arquivo atual aí e outra no site/admin/_foto.php
Verifique também se o $row_foto_eventos[‘Foto’] trata-se realmente de um arquivo válido.
Abs
Sei que o post é antigo, e odeio fazer o trabalho de coveiro. hahahahah
Mas, do jeito que essa função foi feita, ela realiza o cálculo e exibe um valor na tela diferente do exibido pelo sistema operacional. Isso se deve pelo fato de que o valor foi dividido por 1024 em vez de 1000. Segue minha adaptação para a função:
function tamanho_arquivo($arquivo) {
$tamanhoarquivo = filesize($arquivo);
/* Medidas */
$medidas = array(‘KB’, ‘MB’, ‘GB’, ‘TB’);
/* Se for menor que 1KB arredonda para 1KB */
if($tamanhoarquivo 999; $i++){
// Aqui eu divido por 1000 em vez de 1024
$tamanhoarquivo /= 1000;
}
// Alterei também a forma de exibição do valor, para exibir 1 casa após a vírgula
return number_format($tamanhoarquivo, 1, ‘,’, ”) . $medidas[$i – 1];
}
Essa é a minha contribuição. (:
Olá Adriano,
A divisão é feita por 1024 porque trabalha-se na base 2 (1024 = 2 elevado a 9). Logo, para se ter 1 KB eu preciso de 1024 bytes (e não 1000). Para 1 MB preciso de 1024 KB, e assim por diante.
Abs!
Obrigado pelas orientações