← PHP

gravar pdf em mysql db

Lida 10877 vezes

Offline

svaros 
Membro
Mensagens 44 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 3 Level 2 Level 1 10 Posts First Post Karma

ola, estive À procura mas msm assim não encontrei maneira de esclarecer a minha dúvida...

alguém me pode explicar como faço para guardar pdf em mysql db e depois conseguir visualiza

lo?

agradeço desde ja

cumps svaros
Offline

Pedro Lopes 
Beta tester
Mensagens 3568 Gostos 18
Feedback +6

Troféus totais: 32
Trófeus: (Ver todos)
Level 6 Windows User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3

Visualizar onde? A partir do plugin da adobe no browser? Ou visualizar em html?
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Verifica o tipo de dados BLOB/MEDIUMBLOB no MySQL.

Um ficheiro pdf é um ficheiro binário. Basicamente pegas no conteúdo do ficheiro e guarda-lo numa coluna com o tipo de dados mencionado acima. Para mostrares o ficheiro novamente, vais buscar a informação à BD e informas o browser de que o que estás a mostrar é um ficheiro PDF.

Qualquer coisa assim:

Código: (php) [Seleccione]
<?php
$fileName 
strip_tags($_FILES['mypdf']['name']);
$ext substr($fileNamestrrpos($fileName'.') + 1strlen($fileName));

if(
$_FILES['mypdf']['error'] === ERR_NO_ERROR && $ext == 'pdf'){
$file file_get_contents($_FILES['mypdf']['tmp_name']);
$fileSize filesize($_FILES['mypdf']['tmp_name');
$sql "INSERT INTO my_table ('file_name', 'file_contents', 'file_size') VALUES (?, ?, ?)";
$stmt $db->prepare($sql);
$stmt->bindParam(1$fileNamePDO::PARAM_STRING);
$stmt->bindParam(2$filePDO::PARAM_LOB);
$stmt->bindParam(3$fileSizePDO::PARAM_INT);

if($stmt->execute(array($fileName$file$fileSize))){
// Tudo OK
}
}

Código: (php) [Seleccione]
<?php
$stmt 
$db->query('SELECT file_contents, file_name, file_size FROM my_table LIMIT 1');
$data $stmt->fetch();

header('Content-Length: ' $data['file_size']);
header('Content-type: application/pdf');
header('Content-disposition: inline; filename=' $data['file_name']);
header('Content-length: ' $data['file_size']);
echo 
$data['file_contents'];
exit;

Offline

svaros 
Membro
Mensagens 44 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 3 Level 2 Level 1 10 Posts First Post Karma

Visualizar onde? A partir do plugin da adobe no browser? Ou visualizar em html?

para visualizar a partir do plugin do adobe...

obrigado diogoosorio vou tentar... :obrigado:
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Não é mais fácil gravares o path do pdf?
Gravar ficheiros na BD não costuma ser muito eficiente.
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Não é mais fácil gravares o path do pdf?
Gravar ficheiros na BD não costuma ser muito eficiente.

Não é uma coisa linear. Depende da aplicação, depende do projecto, depende dos ficheiros que vais armazenar - regra geral é a conclusão a que a malta chega.

Há uns tempos li um estudo da MS, baseado no MSSQL em relação a isto. Se bem me recordo, do ponto de vista de eficiência chegaram à conclusão que ficheiros até 256KB ficavam melhor na BD, ficheiros com mais de 3MB no sistema de ficheiros.

Mas do topo da cabeça há algumas *vantagens* que podem advir de armazenar a informação em blob's - escalabilidade (ie um sistema de ficheiros atinge determinada capacidade e depois? Symlink's para outras máquinas, discos externos, ??? - os próprios RDBMS incluem mecanismos de balanceamento de carga), backups (?), ...

Mas honestamente falo sem grande conhecimento de causa, ainda não tive nenhum projecto onde guardasse este tipo de informação directamente na BD.

Para projectos pequenos, também sou da opinião que guardar os ficheiros no sistema de ficheiros é mais simples...

Em relação ao artigo, a ver se o encontro já o coloco aqui...

EDIT - Tinha-o aqui num bookmark perdido. Boa leitura - http://research.microsoft.com/apps/pubs/default.aspx?id=64525
Offline

svaros 
Membro
Mensagens 44 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 3 Level 2 Level 1 10 Posts First Post Karma

Não é uma coisa linear. Depende da aplicação, depende do projecto, depende dos ficheiros que vais armazenar - regra geral é a conclusão a que a malta chega.

Há uns tempos li um estudo da MS, baseado no MSSQL em relação a isto. Se bem me recordo, do ponto de vista de eficiência chegaram à conclusão que ficheiros até 256KB ficavam melhor na BD, ficheiros com mais de 3MB no sistema de ficheiros.

Mas do topo da cabeça há algumas *vantagens* que podem advir de armazenar a informação em blob's - escalabilidade (ie um sistema de ficheiros atinge determinada capacidade e depois? Symlink's para outras máquinas, discos externos, ??? - os próprios RDBMS incluem mecanismos de balanceamento de carga), backups (?), ...

Mas honestamente falo sem grande conhecimento de causa, ainda não tive nenhum projecto onde guardasse este tipo de informação directamente na BD.

Para projectos pequenos, também sou da opinião que guardar os ficheiros no sistema de ficheiros é mais simples...

Em relação ao artigo, a ver se o encontro já o coloco aqui...

EDIT - Tinha-o aqui num bookmark perdido. Boa leitura - http://research.microsoft.com/apps/pubs/default.aspx?id=64525


digamos que actualmente sao recebidos +- 600 pdf's dia, seria melhor entao armazenar na bd ou numa pasta?
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Na minha opinião numa pasta sem duvida. No meu ponto de vista gastas muitos mais recursos ao ir acede-lo à bd
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

digamos que actualmente sao recebidos +- 600 pdf's dia, seria melhor entao armazenar na bd ou numa pasta?

Sem não existir um motivo de força, sistema de ficheiros. :)

Só estava a marcar um ponto, as coisas não são tão lineares como se estavam a colocar aqui.
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Sem não existir um motivo de força, sistema de ficheiros. :)

Só estava a marcar um ponto, as coisas não são tão lineares como se estavam a colocar aqui.

Não disse que era sempre melhor armazenar no filesystem, mas é mais fácil de implementar e não vejo razões para, neste caso, não o fazer.

Vou dar uma vista de olhos nesse artigo, parece ser boa leitura :)
Offline

svaros 
Membro
Mensagens 44 Gostos 0
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 3 Level 2 Level 1 10 Posts First Post Karma

obrigado desde já a todos...ja consegui fazer com que o ficheiro fique gravado numa pasta e o nome na bd, assim como recuperá -lo, ou seja, pegar no nome que esta na bd e abrir o ficheiro correspondente da pasta.

agora tenho uma duvida, como poderia antes de gravar na bd e na pasta alterar o nome do ficheiro?imaginem:

ficheiro do que o joao envia: xxx.pdf eu queria que ficasse: 1joao.pdf ( 1 seria o id automatico inserido na bd a quando da adiçao de uma nova linha)

agradeço desde já

cumps svaros
Offline

RuiGomes 
Membro
Mensagens 504 Gostos 0
Feedback +4

Troféus totais: 23
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

obrigado desde já a todos...ja consegui fazer com que o ficheiro fique gravado numa pasta e o nome na bd, assim como recuperá -lo, ou seja, pegar no nome que esta na bd e abrir o ficheiro correspondente da pasta.

agora tenho uma duvida, como poderia antes de gravar na bd e na pasta alterar o nome do ficheiro?imaginem:

ficheiro do que o joao envia: xxx.pdf eu queria que ficasse: 1joao.pdf ( 1 seria o id automatico inserido na bd a quando da adiçao de uma nova linha)

agradeço desde já

cumps svaros

Provavelmente haverá maneira mais fácil, mas assim de repente podes ler o último ID inserido e adicionas 1. Com o ID geras o nome do ficheiro e armazenas o nome gerado na BD;