Сохраните 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
Файл правильно отображается, поэтому я предполагаю, что он правильно сгенерирован и проблема заключается в хранении в БД.
Заранее благодарю.
6 ответов:
Вы не должны обнажать любые (задние)косые черты. При добавлении они используются в качестве escape-символов в запросе и не отображаются в поле.
Попробуйте изменить это
$content = stripslashes($rs['myblobfield']);В это:
$content = $rs['myblobfield'];
Собственно по соображениям безопасности:
- Не используйте
addslashes(), а используйтеmysql_real_escape_string()вместоВ данном конкретном случае (поскольку это бинарные данные):
- удалить
stripslashes()- заменить
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()вместо этого, наряду с:
- удалить
stripslashes()- заменить
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