» Início » Desenvolvimento » Fazendo upload e armazenamento de arquivos usando PHP, parte 1
 
Avaliação: | Publicado em: 24/09/2006
Fazendo upload e armazenamento de arquivos usando PHP, parte 1
João Seabra Programador em PHP há mais de 3 anos, foi oficial do Exército e hoje trabalha em Brasília - DF.


O Upload

Não vou me deter muito nesta parte, pois são utilizadas funções nativas do PHP. Para os iniciantes, estou mandando em anexo o Upilôader Super Mega Pró Plus com Sistema Bleach Tabajara, desenvolvido pelo meu amigo Zé de Paula, com algumas alterações realizadas por mim.

O Campo BLOB

BLOB (Binary Large Object – Grande Objeto Binário), nada mais é que um campo TEXT, case-sensitive, utilizado para armazenar arquivos binários.No MySQL são divididos em 4 tipos:

  • TINYBLOB – armazena até 256 bytes, ou seja, 255 caracteres mais 01 de controle;
  • BLOB – armazena até 64 KB, ou seja, 16.535 caracteres mais 02 de controle;
  • MEDIUMBLOB – armazena até 16MB bits, ou seja, 16.777.216 caracteres mais 03 de controle;
  • LONGBLOB – armazena até 4GB, ou seja, 4.294.967.295 caracteres mais 04 de controle;

Executando o INSERT em um campo BLOB

Agora que já conhecemos os campos BLOB, vamos ver como utilizamos o comando INSERT com ele:

INSERT INTO tabela (id, file) VALUES (1, LOAD_FILE("/tmp/file.gif"));

O que muda de um INSERT normal é o comando LOAD_FILE, o qual deverá ser dado no arquivo que deseja ser inserido no banco. O comando fará a codificação do arquivo file.file num formato inteligível, por exemplo, base64, para o MySQL para a tabela. Neste caso, o caminho do arquivo deve ser dado por completo, por exemplo: /tmp/file.gif ou c:/tmp/file.gif.
Detalhes importantes: Você deverá ter permissão de escrita e leitura no arquivo pra poder realizar a inserção. O tamanho do arquivo também não poderá exceder a variável de ambiente max_allow_packet, caso contrário será inserido NULL.

Executando o SELECT em um campo BLOB

Já conhecemos como fazemos a inserção no MySQL. Vamos verificar agora como usamos o comando SELECT:

SELECT file INTO OUTFILE “/dir/file.file” FROM tabela WHERE id = 1;

O que muda de um SELECT normal é o comando INTO OUTFILE que fará a codificação do arquivo binário no diretório “/dir”. Importante ressaltar que você também deverá ter permissão de leitura e escrita nesse diretório.
Outra ressalva seria que não adianta tentar fazer essa SELECT, tentando visualizar o arquivo dentro do DB, pois o mesmo não conseguirá retornar o arquivo propriamente dito e sim criará um arquivo dentro do diretório especificado.

Desvantagens:

LENTIDÃO – Haverá uma demora desnecessária para a página ser carregada, pois a imagem só será enviada para o cliente após criada no diretório.

BURACOS – O campo BLOB assim com o campo TEXT não realiza a eliminação dos espaços vazios contíguos no final do campo. Por exemplo: Se um arquivo estiver sendo carregado em um campo LONGBLOB e tiver 16.535 caracteres (o tamanho de um campo BLOB) irá “sobrar” 4.294.950.760 caracteres, ou seja, praticamente o campo todo ficará vazio. Ou seja, o arquivo ocupará mais espaço no HD que o necessário.

Vantagens:

BUSCA DE CONTEÚDO – Como o arquivo estará em formato binário, ficará muito mais simples realizar a busca de um conteúdo determinado.

GERENCIAMENTO – Você não precisa se preocupar com permissão de diretórios, nem com segurança. Isso é provido pelo banco de dados.


Bom, por enquanto é só, pessoal!
Qualquer dúvida é só publicar aí embaixo!
Arquivos anexos ao artigo

Me desculpe mas esse tamanho em BITS que você colocou nos campos BLOB esão incorretas...
consulte o manual do MySQL
Vitor Fernando Pamplona <vitor@babaxp.org>
Bom mesmo
João Seabra <johnnyseabra@gmail.com>
Realmente não tinha conferido esse dado. Obrigado por corrigí-lo. TINYBLOB = 256Bytes; BLOB 64kB; MEDIUMBLOB = 16MB; LONGBLOB = 4GB.
Estarei corrigindo-o agora!
ou eu qro saber come q faz pra ospedar imagen no site q fiz no vai.la muaff.vai.la come kara me manda um email e me fala oks
desconhecido
Cara, entra em ctt a admin do site.
gostaria de informcoes ,, estou baixando filmes e ta vindo arquivo .php e sao duas partes dois arquivos ...como torna-lo pronto pra ver ..??favor manda pro email...obrigado...
Thiago Medeiros <infovirtual@gmail.com>
Bem, eu tenho uma duvida basica: Como fazer para eu upar arquivos no mysql, so que ao invés de usar o blob, gostaria apenas de linkar o nome desse arquivo a sua pasta de destino, assim ficaria melhor e mais facil a busca e os recursos no hd. Se poder ajudar mais ainda, gostaria de saber sobre recursos de redimensionamento de imagens atribuidos ao php, e em seguida postagem no banco de dados mysql. Ex: upei foto.jpg, ela tem 800x600 pixels de tamanho, a biblioteca do php passa para 640x480, e em seguida eu jogo no banco de dados linkado. Como proceder ?