Função php para descobrir o tamanho de um arquivo

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!

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. 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

    1. 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

  2. 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. (:

Deixe um comentário

O seu endereço de e-mail não será publicado.