Я использую FPDF / FPDI для объединения PDF-файла из базы данных с изображением в качестве заголовка PDF-файла. Ищу решение, но решение еще не найдено, поэтому я публикую его здесь.
Вот мой код viewpdf.php:
<?php
/**
* Simply import all pages and different bounding boxes from different PDF documents.
*/
use setasign\Fpdi;
use setasign\fpdf;
require_once 'config/config.php';
require_once 'vendor/autoload.php';
require_once 'vendor/setasign/fpdf/fpdf.php';
error_reporting(E_ALL);
ini_set('display_errors', 1);
set_time_limit(2);
date_default_timezone_set('UTC');
$start = microtime(true);
$pdf = new Fpdi\Fpdi();
//$pdf = new Fpdi\TcpdfFpdi('L', 'mm', 'A3');
if ($pdf instanceof \TCPDF) {
$pdf->SetProtection(['print'], '', 'owner');
$pdf->setPrintHeader(true);
$pdf->Image('logo-small.png',50,5,100);
$pdf->setPrintFooter(false);
}
$certid= $_GET['id'];
$sql = "SELECT pdfblob from subject WHERE certid = '".$certid."' ";
$resultc = $virtual_con->query($sql);
while($row=mysqli_fetch_assoc($resultc)) {
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Type:application/pdf");
header("Content-Transfer-Encoding: binary");
$a = (base64_decode($row["pdfblob"]));
$files = [$a];
foreach ($files as $file) {
$pageCount = $pdf->setSourceFile($file);
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
$pdf->AddPage();
$pageId = $pdf->importPage($pageNo, '/MediaBox');
$pageId = $pdf->importPage($pageNo, Fpdi\PdfReader\PageBoundaries::ART_BOX);
$s = $pdf->useTemplate($pageId, 10, 10, 200);
}
}
$file = uniqid().'.pdf';
$pdf->Output('I', 'simple.pdf');
}
//$pdf->Output('output/'.$file, 'I');
?>
Он не загружает PDF-файл из базы данных. «Не удалось загрузить PDF-документ».
Вот мой upload.php для хранения PDF в базе данных. Это мой PDF-файл поврежден или что-то в этом роде? Я всегда использую PDO для взаимодействия с базой данных, но эта работа реализует mysqli, поэтому мне нужно следить за потоком системы.
<?php
include('config/config.php');
session_start();
$certid=$_POST['certid'];
$vendorid=$_POST['vendorid'];
$sid=$_POST['subjectid'];
$target_file = $_FILES["fileToUpload"]["name"];
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
$uploadOk = 1;
if (isset($_POST['submit'])) {
$data = mysqli_real_escape_string($virtual_con,$_FILES['fileToUpload']['tmp_name']);
$data = file_get_contents($data);
$data = base64_encode($data);
$uploadOk = 1;
if (isset($data)) {
$sql = "UPDATE `subject` SET `pdfblob`='".$data."' WHERE (`Subjectid`='".$sid."')";
$result=mysqli_query($virtual_con,$sql);
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
$to = "subjects.php?subjectid = ".$sid."&certid = ".$certid."&vendori = ".$vendorid;
gotoInterface($to);
}
else{
echo 'Fail to upload file';
}
}
if ($imageFileType ! = "pdf" ) {
echo "Sorry, PDF is allowed.";
$uploadOk = 0;
}
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
?>
Я надеюсь, что кто-нибудь может помочь мне в работе над этим кодом. Я попытался решить их, но все равно не смог загрузить результат. Я пытаюсь просмотреть PDF-файл без использования FPDF, но все равно не работаю. Мне интересно, может ли мой код повредить большой двоичный объект при загрузке?
Столбец для ['pdfblob'] - blob.
Вы ответили на последнюю часть моего вопроса; как насчет первой части?
да решить ке белум ни?
@ Fiido93 belum решить лаги ...
@AimanHakeem проверьте мой ответ, вы пробовали?






Я делаю это как ответ, а не как комментарий, потому что он будет слишком длинным для комментария. Выполните следующие действия, чтобы определить, где что-то пошло не так.
$data = mysqli_real_escape_string($virtual_con,$_FILES['fileToUpload']['tmp_name']); могла бы скомпилировать файл. Попробуйте сохранить заведомо исправный PDF-файл в базу данных из локального хранилища и не использовать процесс загрузки файла, а затем попробуйте снова его декодировать. Если вы можете вернуть это в PDF-файл, значит, ваша загрузка его испортила. В противном случае переходите к шагу 2.Надеюсь, это помогло.
Фактически, экранирование ввода файла требуется при сохранении в виде большого двоичного объекта. В противном случае выдаст ошибку.
Я всегда делал все возможное, чтобы не сохранять данные таким образом, поэтому я этого не знал (или знал и забыл). Тем не менее, все еще возможно, что его данные каким-то образом были повреждены в процессе. Лучше всего проверить и убедиться.
Я мог бы заменить mysqli_real_escape_string(), заменив дополнительные косые черты. Его все еще можно было загрузить. Но в целях безопасности заменяю addslashes на mysqli_real_escape_string().
Если ваш столбец в mysql pdfblob типа blob.
Тогда я предлагаю вам изменить тип на тип LONGBLOB.
Так как тип BLOB в MySQL хранит только до 64 КБ.
Если все равно не работает, то Изменение в my.ini
max_allowed_packet=500M
мой тип данных уже изменился на длинный blob, но все еще не работает.
Что
mysqli_error($virtual_con)отбросил на запросы? Действительно ли столбец для файла представляет собой большой двоичный объект?