Algumas aplicações web necessitam que os arquivos .jpg, .doc, .pdf e etc. sejam gravados no banco de dados MySql. Para isso, podemos fazer um script PHP que realize esta tarefa.

Para iniciar, vamos criar uma tabela para armazenar estes arquivos. Abaixo segue a estrutura da tabela:

  • id: Identificador único para cada arquivo
  • nome: O nome do arquivo
  • tipo: Tipo do conteúdo
  • tamanho: Tamanho do arquivo
  • conteudo: O arquivo em si

Para a coluna conteudo, vamos usar o tipo de dados BLOB. BLOB é um objeto binário grande que pode conter uma quantidade variável de dados. O MySQL possui quatro tipos de dados BLOB:

  • TINYBLOB
  • BLOB
  • MEDIUMBLOB
  • LONGBLOB

O tipo BLOB é limitado a 64 kilobytes de armazenamento, enquanto que o MEDIUMBLOB possui capacidade de até até 16 megabytes. Iremos utilizar o tipo MEDIUMBLOB para que possamos armazenar arquivos maiores. Abaixo o SQL para a criação ta tabela:

CREATE TABLE upload (
   id INT NOT NULL AUTO_INCREMENT,
   nome VARCHAR(30) NOT NULL,
   tipo VARCHAR(30) NOT NULL,
   tamanho INT NOT NULL,
   conteudo MEDIUMBLOB NOT NULL,
   PRIMARY KEY(id)
);

O upload de um arquivo para o banco MySQL é um processo de duas etapas. Primeiro você precisa fazer o upload do arquivo para o servidor, e  em seguida, ler o arquivo e inseri-lo no banco de dados.

Para enviar um arquivo, precisamos de um formulário para que o usuário digite o nome do arquivo ou que possa procurar no seu computador, selecionando um arquivo. A tag input type = “file” é usada para esse fim.

Primeiramente iremos fazer o formulário:

<form method="post" enctype="multipart/form-data">
   <table width="350" border="0" cellpadding="1" cellspacing="1" class="box">
      <tr>
         <td width="246">
           <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
           <input name="userfile" type="file" id="userfile">
         </td>
         <td width="80"><input name="upload" type="submit" class="box" id="upload" value=" Upload "></td>
      </tr>
   </table>
</form>

O formulário de upload deve ter o encytype = “multipart / form-data”, caso contrário não vai funcionar. É claro que o método de formulário também precisa ser configurado para method = “post”. Lembre-se também de colocar um campo MAX_FILE_SIZE oculto antes do campo arquivo, pois isto irá restringir o tamanho dos arquivos.

Após o formulário ser enviado, o código terá que ter acesso as variáveis globais $ _FILES. No exemplo acima, o nome da tag iput para o arquivo é userfile, então teremos como retorno para $ _FILES:

$ _FILES [‘Userfile’] [‘name’]
O nome original do arquivo na máquina do cliente.

$ _FILES [‘Userfile’] [‘type’]
O tipo mime do arquivo, se o browser deu esta informação. Um exemplo seria “image / gif”.

$ _FILES [‘Userfile’] [‘size’]
O tamanho, em bytes, do arquivo enviado.

$ _FILES [‘Userfile’] [‘tmp_name’]
O nome temporário do arquivo que foi armazenado no servidor.

$ _FILES [‘Userfile’] [‘error’]
O código de erro associado a este upload de arquivo, se houver.

Sendo assim, teremos o restante do arquivo de upload, com o código PHP acrescentado:

<?php
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fileName = $_FILES['userfile']['name'];
$tmpName  = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
 
$fp      = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
 
if(!get_magic_quotes_gpc())
{
    $fileName = addslashes($fileName);
}
 
include 'library/config.php';
include 'library/opendb.php';
 
$query = "INSERT INTO upload (nome, tipo, tamanho, conteudo ) ".
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')";
 
mysql_query($query) or die('Error, query failed');
include 'library/closedb.php';
 
echo "<br>File $fileName uploaded<br>";
}
?>

Antes de fazer qualquer coisa com o arquivo enviado você não deve assumir que o arquivo foi enviado com sucesso para o servidor. Sempre verifique se o arquivo foi enviado com sucesso olhando para o tamanho do arquivo. Se for maior do que zero byte, então podemos assumir que o arquivo foi carregado com sucesso.

O PHP salva o arquivo enviado com um nome temporário, na variável $ _FILES [‘userfile’] [‘tmp_name’]. A próxima tarefa é ler o conteúdo deste arquivo e inserir o conteúdo de banco de dados. Sempre certifique-se de usar a função addslashes() para escapar o conteúdo, e use-a também para obter o nome  do arquivo, pois você nunca sabe o que o nome que o arquivo terá.

Para o upload dos arquivos é isso.  Agora é hora de baixarmos esses arquivos.

Download de arquivos em banco de dados MySQL utilizando o PHP

Quando é feito o upload de um arquivo de banco de dados, devemos também salvar o tipo de arquivo e sua extensão. Estes dados não eram necessários para fazer o upload dos arquivos, mas são necessários para fazer o download dos arquivos.

A página abaixo lista os nomes dos arquivos armazenados no banco de dados. Os nomes são impressos como uma URL. A url ficaria como download.php? Id = 3.

Exemplo download.php:

<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
 
<body>
<?php
include 'library/config.php';
include 'library/opendb.php';
 
$query = "SELECT id, nome FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
echo "Database is empty <br>";
}
else
{
while(list($id, $nome) = mysql_fetch_array($result))
{
?>
<a href="download.php?id=<?php=$id;?>"><?php=$nome;?></a> <br>
<?php
}
}
include 'library/closedb.php';
?>
</body>
</html>

Quando você clica no link de download, o $ _GET [‘id’] será definido. Podemos usar este ID para identificar quais arquivos do banco de dados deverão ser mostrados. Abaixo está o código PHP para o download dos arquivos de banco de dados MySQL.

<?php
if(isset($_GET['id']))
{
// if id is set then get the file with the id from database
 
include 'library/config.php';
include 'library/opendb.php';
 
$id    = $_GET['id'];
$query = "SELECT nome, tipo, tamanho, conteudo " .
         "FROM upload WHERE id = '$id'";
 
$result = mysql_query($query) or die('Error, query failed');
list($nome, $tipo, $tamanho, $conteudo) = mysql_fetch_array($result);
 
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $content;
 
include 'library/closedb.php';
exit;
}
 
?>

Antes de visualizar o conteúdo do arquivo usando echo, primeiro precisamos definir vários cabeçalhos:

header (“Content-length: $ size”)
Este cabeçalho informa ao navegador o tamanho do arquivo. Alguns navegadores precisam desta informação para poder baixar o arquivo corretamente. De qualquer forma, é uma boa maneira de dizer o quão grande é o arquivo podendo se prever quanto tempo o download vai demorar.

header (“Content-type: $ type”)
Este cabeçalho informa ao navegador que tipo de arquivo ele irá baixar.

header (“Content-Disposition: attachment; filename = $ name”);
Diz ao navegador para salvar o arquivo baixado com o nome especificado. Se você não enviar este cabeçalho, o navegador vai tentar salvar o arquivo usando o nome do script (download.php).

NOTA:
Ao enviar os cabeçalhos uma possível mensagem de erro poderá ser assim:

Warning: Cannot modify header information – headers already sent by (output started at C:\Webroot\library\config.php:7) in C:\Webroot\download.php on line 13

Este erro acontece porque alguns dados já foram enviados antes de enviar o cabeçalho da página. Quando a mensagem de erro acima acontece, é porque você “acidentalmente” adicionou um espaço a direita após a tag de fechamento PHP (>).

Bem, por hoje é isto. espero que este post tenha sido útil, ainda mais se você estava em dúvida de como fazer o upload de um arquivo diretamente no banco de dados utilizando PHP


Emilio Mario Wieczorek

I talk about everything, I discuss everything, but I only support 🇧🇼Grêmio. 💻IT Manager, 🎮Gamer and 👽Jedi (or Sith, depending on the day).

0 comentário

Deixe um comentário

Avatar placeholder

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *