Сохраните PDF-файл, созданный с помощью библиотеки FPDF php, в поле blob MySQL



Мне нужно создать pdf-файл с библиотекой fpdf и сохранить его в поле blob в моей базе данных MySQL.
Проблема в том, что когда я пытаюсь извлечь файл из поля blob и отправить его в браузер для загрузки, файл donwloaded поврежден и не отображается правильно.



Тот же файл 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


Файл правильно отображается, поэтому я предполагаю, что он правильно сгенерирован и проблема заключается в хранении в БД.



Заранее благодарю.

731   6  

6 ответов:

Вы не должны обнажать любые (задние)косые черты. При добавлении они используются в качестве escape-символов в запросе и не отображаются в поле.

Попробуйте изменить это

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

В это:

$content = $rs['myblobfield'];

Собственно по соображениям безопасности:

  1. Не используйте addslashes() , а используйте mysql_real_escape_string() вместо

В данном конкретном случае (поскольку это бинарные данные):

  1. удалить stripslashes()
  2. заменить addslashes() на mysql_real_escape_string()

Сравните различия в строках, чтобы помочь отладить проблему.

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

Замена

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

С

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

Работал на меня.

РЕШИЛ ЕЕ!

У меня тоже была та же проблема, и я пробовал вышеупомянутые идеи. Что исправило это для меня, так это то, что моя база данных MySQL хранила PDF как blob вместо mediumblob. Поле blob ограничено 64K и тем самым урезало остальную часть моего PDF, которая включала ценные данные, включая EOF (отсюда неприятная ошибка Adobe).

Для подтверждения загрузите PDF-файл, который он обслуживает, и посмотрите на размер файла. Если это точно 64K вам нужно будет сделать больше место в БД, установив в поле значение mediumblob.

Спасибо всем за помощь!

Кстати, я последовал совету Тото и использовал mysql_real_escape_string() вместо этого, наряду с:

  1. удалить stripslashes()
  2. заменить addslashes() на mysql_real_escape_string()

С этими изменениями в исходном коде плаката это сработало!

Я недавно работал с этой проблемой, и важно дать ответ после тестовых решений, данных нами. Затем я решил эту проблему следующим образом. для сохранения сгенерированного 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
}
Эти коды работали идеально. Я надеюсь, что этот вклад поможет другим снять головную боль с этой проблемой. с уважением.

Comments

    Ничего не найдено.