3

fpdfライブラリを使用してpdfファイルを作成し、MySQLデータベースのblobフィールドに保存する必要があります。問題は、blobフィールドからファイルを取得してダウンロードのためにブラウザーに送信しようとすると、ダウンロードされたファイルが破損し、正しく表示されないことです。

同じpdfファイルをデータベースに保存せずにすぐにブラウザに送信すると正しく表示されるため、データベースに挿入すると一部のデータが破損しているようです。

私のコードは次のようなものです:

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

PDFを保存するには、次のようにします。

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

ダウンロードのためにブラウザに送信します。私は何が間違っているのですか?

コードを次のように変更した場合:

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

ファイルは正しく表示されているので、正しく生成されており、問題はデータベースへの保存にあると思います。

前もって感謝します。

4

6 に答える 6

3

実際にはセキュリティ上の理由から:

  1. 使わない代わりにaddslashes()使うmysql_real_escape_string()

この特定のケースでは (バイナリ データであるため):

  1. 削除するstripslashes()
  2. addslashes()で置き換えますmysql_real_escape_string()
于 2009-08-20T15:50:31.870 に答える
2

(バック) スラッシュを削除しないでください。これらを追加すると、クエリでエスケープ文字として使用され、フィールドには表示されません。

これを変更してみてください

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

これに:

$content = $rs['myblobfield'];
于 2009-08-20T15:38:33.580 に答える
1

文字列の違いを比較して、問題のデバッグに役立ててください。

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

$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;
于 2009-08-20T15:43:50.807 に答える
1

交換する

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

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

私のために働いた。

于 2010-11-13T03:17:15.930 に答える
0

私は最近この問題に取り組んでおり、私たちが提供したテストソリューションの後に回答を提供することが重要です. 次に、この問題を次のように解決しました。生成された fpdf を保存するには、このコードを使用しました.. :

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

データベースから読み取る(データベースから取得する)には、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
}

これらのコードは完全に機能しました。この貢献が、他の人がこの問題で頭痛を解消するのに役立つことを願っています。よろしくお願いします。

于 2016-11-17T11:57:12.977 に答える
0

解決しました!

私も同じ問題を抱えていて、上記のアイデアを試していました。これを修正したのは、MySQL データベースが PDF をblobではなく として保存していたことですmediumblob。blob フィールドは 64K に制限されているため、EOF を含む貴重なデータを含む PDF の残りの部分が切り捨てられていました (そのため、厄介な Adob​​e エラーが発生しました)。

確認するには、代わりに提供される PDF ファイルをダウンロードし、ファイル サイズを確認します。正確に 64K の場合は、フィールドを に設定して、DB により多くのスペースを確保する必要がありますmediumblob

助けてくれてありがとう!

ところで、私は Toto のアドバイスに従い、mysql_real_escape_string()代わりに次のものを使用しました。

  1. 削除するstripslashes()
  2. addslashes()で置き換えますmysql_real_escape_string()

元のポスターのコードにこれらの変更を加えることで、うまくいきました!

于 2010-07-12T01:44:17.663 に答える