2009-08-20 7 views
3

fpdf 라이브러리가있는 pdf 파일을 만들어 MySQL 데이터베이스의 blob 필드에 저장해야합니다. 문제는, blob 필드에서 파일을 검색하고 다운로드를 위해 브라우저로 보내면, donwloaded 파일이 손상되어 올바르게 표시되지 않는다는 것입니다.MySQL blob 필드에 FPDF php 라이브러리로 만든 PDF를 저장하십시오.

DB에 저장하지 않고 바로 브라우저로 보내면 동일한 pdf 파일이 올바르게 표시되므로 db에 데이터가 삽입 될 때 일부 데이터가 손상된 것처럼 보입니다.

$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 

파일이 올바르게 표시됩니다, 그래서 그것이 제대로 생성 가정 문제가 DB에 저장에 : 나는 내 코드를 변경하는 경우

.

미리 감사드립니다.

답변

2

슬래시는 제거하지 마십시오. 추가 할 때 쿼리에서 이스케이프 문자로 사용되며 필드에 나타나지 않습니다. 이에이

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

을 변경

시도 :

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

내 실수를 보여 주셔서 감사합니다. –

+0

안녕하세요.이 주제에 관심이 있습니다. 파일 시스템에 저장하는 방법은 무엇입니까? 이메일을 통해 pdf를 보내야합니다. 덕분에 –

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

보안상의 이유로 : 그것은 이진 데이터가 그대로

  1. (이 특정한 경우 mysql_real_escape_string() 대신

addslashes()를 사용하지만 사용하지 마십시오) :

  1. mysql_real_escape_string()
0

에 의해 stripslashes()

  • addslashes()를 교체 제거 그것을 해결!

    나는 또한 동일한 문제를 안고 위에서 언급 한 아이디어를 시도하고있었습니다. 이 문제를 해결 한 이유는 내 MySQL 데이터베이스가 mediumblob 대신 blob으로 PDF를 저장하고 있기 때문입니다. blob 필드는 64K로 제한되어 있으므로 EOF를 포함하여 귀중한 데이터가 포함 된 나머지 PDF는 잘립니다 (따라서 어도비 오류).

    확인하려면 대신 제공되는 PDF 파일을 다운로드하고 파일 크기를 확인하십시오. 정확히 64K 인 경우 필드를 으로 설정하여 DB에 더 많은 공간을 확보해야합니다.

    도움을 주신 모든 분들께 감사드립니다. 그런데

    , 나는 토토의 조언을 따라와 함께, 대신 mysql_real_escape_string()을 사용 : stripslashes()
  • 원래 포스터의 코드에 이러한 변경으로 mysql_real_escape_string()
  • 에 의해 addslashes()를 교체 제거

    1. 그 일했다!

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

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

      교체

    0

    저는 최근이 문제를 해결하기 위해 노력하고 있으며, 우리가 제공 한 테스트 솔루션을 통해 답변을 제공하는 것이 중요합니다. 그런 다음이 문제를 다음과 같이 해결했습니다.

    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 
    } 
    

    그 코드 : 이 코드 .. 사용한 생성 FPDF를 저장하려면 : 나 PDO 코드를 사용하는 내 데이터베이스에서

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

    는 (데이터베이스에서 검색) 읽으려면이 바람직했다 완벽하게 일했습니다. 이 공헌이 다른 사람들이이 문제로 인해 두통을 풀 수있게 해주시기 바랍니다. 친애하는.

    +0

    이 짧은 코드를 테스트했으며 잘 작동합니다 –

    +0

    "../../connect/connect.php"; \t $ var = $ _GET [ 'var']; $ sql = "SELECT * FROM ficheirosprop WHERE idfich =". $ var; $ res = $ conn-> query ($ sql); $ row = $ res-> fetch_assoc(); /*** 헤더를 설정하고 파일을 표시하십시오. ***/ header ("Content-Type :". $ row [ 'mime']); header ("Content-Length :". $ row [ 'size']); header ("Content-Disposition : inline; filename = '". ($ row ['name ']). "'")); echo $ row [ 'data']; \t \t $ conn-> close(); –