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
0 comentário