2009-08-20 6 views
3

Ich muss eine PDF-Datei mit der fpdf-Bibliothek erstellen und sie in einem Blob-Feld in meiner MySQL-Datenbank speichern. Das Problem ist, wenn ich versuche, die Datei aus dem Blob-Feld abzurufen und an den Browser für den Download zu senden, ist die heruntergeladene Datei beschädigt und wird nicht korrekt angezeigt.Speichern Sie ein mit FPDF-PHP-Bibliothek erstelltes PDF in einem MySQL-Blob-Feld

Die gleiche PDF-Datei wird korrekt angezeigt, wenn ich es sofort an den Browser sende, ohne es in der Datenbank zu speichern, so scheint es, dass einige der Daten beschädigt werden, wenn in der Datenbank eingefügt wird.

Mein Code ist so etwas wie dieses:

$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); 

die pdf zu speichern, und wie folgt aus:

$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; 

sie an den Browser senden zum Download bereit. Was mache ich falsch?

Wenn ich den Code ändern zu:

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

die Datei korrekt angezeigt wird, so nehme ich an, dass korrekt erzeugt wird, und das Problem ist in dem Speicher in der db.

Vielen Dank im Voraus.

Antwort

2

Sie sollten keine Schrägstriche entfernen. Wenn Sie sie hinzufügen, werden sie in der Abfrage als Escape-Zeichen verwendet und erscheinen nicht im Feld.

Versuchen Sie, diese

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

in diese zu ändern: debuggen, das Problem zu helfen

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

So einfach und so offensichtlich, danke, dass Sie mir meinen Fehler gezeigt haben :) –

+0

Hallo, ich bin an diesem Thema interessiert.Wie speichern Sie es dann auf einem Dateisystem? Ich muss das PDF per E-Mail senden. danke –

1

Vergleichen Sie die Unterschiede in den Streichern.

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

und

$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

Eigentlich aus Sicherheitsgründen:

  1. nicht addslashes() aber mysql_real_escape_string() statt

In diesem speziellen Fall verwenden Verwenden Sie (wie es Binärdaten):

  1. entfernen stripslashes()
  2. ersetzen addslashes() von mysql_real_escape_string()
0

IT GELÖST!

Ich hatte auch das gleiche Problem und versuchte die oben genannten Ideen. Was dieses für mich reparierte war, dass meine MySQL Datenbank die PDF als blob statt mediumblob speicherte. Ein Blob-Feld ist auf 64K beschränkt und löste damit den Rest meiner PDF-Datei, die die wertvollen Daten einschließlich EOF enthielt (daher der böse Adobe-Fehler).

Um dies zu bestätigen, laden Sie stattdessen die PDF-Datei herunter, die auf dem Bildschirm angezeigt wird, und sehen Sie sich die Dateigröße an. Wenn es genau 64K ist, müssen Sie mehr Platz in der DB schaffen, indem Sie das Feld auf mediumblob setzen.

Vielen Dank für die Hilfe!

By the way, ich folgte Toto Rat und verwendet mysql_real_escape_string() stattdessen zusammen mit:

  1. entfernen stripslashes()
  2. addslashes() Ersetzen von mysql_real_escape_string()

Mit diesen Änderungen an den Code des Original-Poster es hat funktioniert!

1

Ersetzen

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

mit

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

für mich gearbeitet.

0

Ich habe vor kurzem mit diesem Problem gearbeitet und es ist wichtig, die von uns gegebenen Testlösungen zu geben. Dann löste ich dieses Problem wie folgt. Um erzeugt fpdf zu speichern i diesen Code verwendet haben ..:

$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); 

Um aus meiner Datenbank gelesen (aus der Datenbank abrufen) vorzuziehen war mir gU Code verwenden:

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 
} 

diese Codes hat perfekt funktioniert. Ich hoffe, dass dieser Beitrag anderen dabei hilft, Kopfschmerzen mit diesem Problem abzuwenden. Freundliche Grüße.

+0

Ich habe diesen kurz Code getestet und funktioniert gut bis –

+0

include "../../connect/connect.php"; \t $ var = $ _GET ['var']; $ sql = "SELECT * FROM ficheirosprop WHERE idfich =". $ Var; $ res = $ conn-> Abfrage ($ sql); $ row = $ res-> fetch_assoc(); /*** setze die Header und zeige die Datei an ***/ header ("Content-Type:". $ Row ['mime']); header ("Inhaltslänge:". $ Row ['size']); header ("Inhalts-Disposition: inline; Dateiname = '". ($ Row [' name ']). "'"); echo $ row ['Daten']; \t \t $ conn-> close(); –

Verwandte Themen