Не удалось отобразить большой двоичный объект PDF с помощью FPDF

Я использую 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, но все равно не работаю. Мне интересно, может ли мой код повредить большой двоичный объект при загрузке?

Что mysqli_error($virtual_con) отбросил на запросы? Действительно ли столбец для файла представляет собой большой двоичный объект?

Funk Forty Niner 16.11.2018 05:34

Столбец для ['pdfblob'] - blob.

Aiman Hakeem 16.11.2018 07:58

Вы ответили на последнюю часть моего вопроса; как насчет первой части?

Funk Forty Niner 16.11.2018 14:13

да решить ке белум ни?

Fiido93 17.11.2018 00:17

@ Fiido93 belum решить лаги ...

Aiman Hakeem 17.11.2018 07:15

@AimanHakeem проверьте мой ответ, вы пробовали?

Fiido93 17.11.2018 10:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
6
718
2

Ответы 2

Я делаю это как ответ, а не как комментарий, потому что он будет слишком длинным для комментария. Выполните следующие действия, чтобы определить, где что-то пошло не так.

  1. Ваша проблема МОГ БЫ заключается в том, что ваша линия $data = mysqli_real_escape_string($virtual_con,$_FILES['fileToUpload']['tmp_name']); могла бы скомпилировать файл. Попробуйте сохранить заведомо исправный PDF-файл в базу данных из локального хранилища и не использовать процесс загрузки файла, а затем попробуйте снова его декодировать. Если вы можете вернуть это в PDF-файл, значит, ваша загрузка его испортила. В противном случае переходите к шагу 2.
  2. Закодируйте файл и сохраните результат перед загрузкой в ​​базу данных (в текстовом редакторе). Затем запросите базу данных для этого файла и, прежде чем декодировать его, также вставьте эту строку в текстовый редактор и сравните две строки. Если они разные, вы знаете, что ваша база данных что-то делает с файлом. Если они такие же, я не знаю, что вам еще сказать.

Надеюсь, это помогло.

Фактически, экранирование ввода файла требуется при сохранении в виде большого двоичного объекта. В противном случае выдаст ошибку.

Funk Forty Niner 16.11.2018 05:32

Я всегда делал все возможное, чтобы не сохранять данные таким образом, поэтому я этого не знал (или знал и забыл). Тем не менее, все еще возможно, что его данные каким-то образом были повреждены в процессе. Лучше всего проверить и убедиться.

Difster 16.11.2018 05:35

Я мог бы заменить mysqli_real_escape_string(), заменив дополнительные косые черты. Его все еще можно было загрузить. Но в целях безопасности заменяю addslashes на mysqli_real_escape_string().

Aiman Hakeem 16.11.2018 08:01

Если ваш столбец в mysql pdfblob типа blob.

Тогда я предлагаю вам изменить тип на тип LONGBLOB.

Так как тип BLOB в MySQL хранит только до 64 КБ.

Если все равно не работает, то Изменение в my.ini

max_allowed_packet=500M

мой тип данных уже изменился на длинный blob, но все еще не работает.

Aiman Hakeem 21.11.2018 11:29

Другие вопросы по теме