2009-08-20 6 views
3

Je dois créer un fichier PDF avec la bibliothèque fpdf et l'enregistrer dans un champ BLOB dans ma base de données MySQL. Le problème est que lorsque j'essaie de récupérer le fichier dans le champ blob et de l'envoyer au navigateur pour le téléchargement, le fichier téléchargé est corrompu et ne s'affiche pas correctement.Enregistrer un PDF créé avec la bibliothèque FPDF php dans un champ BLOB

Le même fichier pdf est correctement affiché si je l'envoie immédiatement au navigateur sans le stocker dans la base de données, il semble donc que certaines données sont corrompues quand il est inséré dans la base de données.

Mon code est quelque chose comme ceci:

$pdf = new MyPDF(); //class that extends FPDF and create te pdf file 
$content = $pdf->Output("", "S"); //return the pdf file content as string 
$sql = "insert into mytable(myblobfield) values('".addslashes($content)."')"; 
mysql_query($sql); 

pour stocker le pdf, et comme celui-ci:

$sql = "select myblobfield from mytable where id = '1'"; 
$result = mysql_query($sql); 
$rs = mysql_fetch_assoc($result); 
$content = stripslashes($rs['myblobfield']); 
header('Content-Type: application/pdf'); 
header("Content-Length: ".strlen(content)); 
header('Content-Disposition: attachment; filename=myfile.pdf'); 
print $content; 

pour envoyer au navigateur pour le téléchargement. Qu'est-ce que je fais de mal?

Si je change mon code pour:

$pdf = new MyPDF(); 
$pdf->Output(); //send the pdf to the browser 

le fichier est affiché correctement, donc je suppose que est généré correctement et que le problème est dans le stockage dans la db.

Merci d'avance.

Répondre

2

Vous ne devez pas enlever les barres obliques (arrière). Lorsque vous les ajoutez, ils sont utilisés comme caractères d'échappement dans la requête et n'apparaissent pas dans le champ.

Essayez de changer cette

$content = stripslashes($rs['myblobfield']); 

dans ce:

$content = $rs['myblobfield']; 
+0

Si facile et si évident, merci de me montrer mon erreur :) –

+0

Bonjour je suis intéressé par ce sujet.Comment l'enregistrez-vous sur un système de fichiers alors? J'ai besoin d'envoyer le pdf par email. merci –

1

Comparez les différences dans les cordes pour aider à déboguer le problème.

$pdf = new MyPDF(); 
echo $pdf->Output("", "S"); //send the pdf string to the browser 
exit; 

et

$pdf = new MyPDF(); //class that extends FPDF and create te pdf file 
$content = $pdf->Output("", "S"); //return the pdf file content as string 
$sql = "insert into mytable(myblobfield) values('".addslashes($content)."')"; 
mysql_query($sql); 
$sql = "select myblobfield from mytable where id = '1'"; 
$result = mysql_query($sql); 
$rs = mysql_fetch_assoc($result); 
$content = stripslashes($rs['myblobfield']); 
echo $content; //send the pdf string to the browser 
exit; 
3

En fait, pour des raisons de sécurité:

  1. Ne pas utiliser la addslashes() mais l'utilisation mysql_real_escape_string() à la place

Dans ce cas précis (comme il est des données binaires):

  1. Retirez stripslashes()
  2. Remplacer addslashes() par mysql_real_escape_string()
0

IT RESOLU! J'ai également eu le même problème et essayait les idées mentionnées ci-dessus. Ce qui a résolu cela pour moi était que ma base de données MySQL stockait le PDF en tant que blob au lieu de mediumblob. Un champ blob est limité à 64K et tronquait ainsi le reste de mon PDF qui incluait les précieuses données incluant EOF (d'où la vilaine erreur Adobe).

Pour confirmer, téléchargez plutôt le fichier PDF qu'il contient et vérifiez la taille du fichier. Si c'est exactement 64 Ko, vous devrez faire plus d'espace dans la base de données en définissant le champ sur mediumblob.

Merci à tous pour votre aide!

Soit dit en passant, j'ai suivi les conseils de Toto et utilisé à la place mysql_real_escape_string(), ainsi que:

  1. Retirez stripslashes()
  2. Remplacer addslashes() par mysql_real_escape_string()

Avec ces modifications au code de l'affiche originale il travaillé!

1

Remplacement

header("Content-Length: ".strlen(content)); 

avec

header("Content-Length: ".strlen($content)); 

a fonctionné pour moi.

0

Je travaillais récemment avec ce problème et il est important de donner réponse après des solutions de test donnés par nous. Ensuite, j'ai résolu ce problème comme suit. Pour enregistrer généré fpdf j'ai utilisé ce code ..:

$content = $pdf->Output("", "S"); 
// addslashes is the key to store blob file 
$data = addslashes($content); 
$name = "testname.pdf"; 
$mime = "application/pdf"; 
$extficheiro = "pdf"; 
$nomeficheiro = "miarchivo"; 
$size = strlen($content); 
$query = "INSERT INTO filetable(name, mime, size, data, created) 
    VALUES ('$name','$mime', '$size', '$data', NOW())";      
$conn->query($query); 

Pour lire (récupérer la base de données) de ma base de données était préférable de me utiliser le code pdo:

if(filter_has_var(INPUT_GET, "var") !== false && filter_input(INPUT_GET, 'var', FILTER_VALIDATE_INT) !== false) 
{ 
    $var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_NUMBER_INT); 
    try  { 
     $dbh = new PDO("mysql:host=our_host;dbname=database", 'username', 'password'); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $sql = "SELECT * FROM filetable WHERE id= ".$var; 

     $stmt = $dbh->prepare($sql); 
     $stmt->execute(); 
     $stmt->setFetchMode(PDO::FETCH_ASSOC); 
     $array = $stmt->fetch(); 

     /*** set the headers and display the file ***/ 
     header("Content-Type: ". $array['mime']); 
     header("Content-Length: ". $array['size']);/**/ 
     header("Content-Disposition: inline; filename='". ($array['name'])."'"); 
     echo $array['data']; 
    } 
    catch(PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 
    catch(Exception $e) 
    { 
     echo $e->getMessage(); 
    } 
} 
else 
{ 
    echo '0'; // out of bounds 
} 

Ces codes travaillé parfaitement. J'espère que cette contribution aide les autres à éteindre les maux de tête avec ce problème. Meilleures salutations.

+0

J'ai testé ce code sous peu et fonctionne bien à –

+0

inclure "../../connect/connect.php"; \t $ var = $ _GET ['var']; $ sql = "SELECT * FROM fichierirosprop O WH idfich =". $ Var; $ res = $ conn-> requête ($ sql); $ row = $ res-> fetch_assoc(); /*** définir les en-têtes et afficher le fichier ***/ header ("Content-Type:". $ Row ['mime']); header ("Content-Length:". $ Row ['size']); header ("Content-Disposition: inline; nomfichier = '". ($ Row [' nom ']). "'"); echo $ row ['données']; \t \t $ conn-> close(); –

Questions connexes