Сохраните pdf-object-data из JS как blob в базе данных с PHP - PullRequest
0 голосов
/ 23 марта 2020

У меня следующая проблема: у меня есть веб-приложение для подписи pdf-файлов в браузере. Пользователь может загрузить PDF-файл, который будет сохранен как BLOB-файл в базе данных sql. Теперь другой пользователь может подписать файл цифровой подписью. Это работает нормально, но у меня проблемы с отправкой подписывающих данных обратно в PHP, чтобы обновить файл BLOB-объекта в базе данных данными подписи. Чтобы следующий пользователь мог подписать файл в другой раз.

Это мой способ сохранить файл в базе данных (upload_system_va. php):

$filedata = base64_encode(file_get_contents($_FILES['upl_file']['tmp_name']));
$dbcon = new PDO(...);

$insert_file = $dbcon->prepare(
    "UPDATE document SET doc_blob = :blob, `status` = :status WHERE did = :did"
);

$insert_file->bindParam(':blob', $filedata, PDO::PARAM_LOB);
$insert_file->bindParam(':status', $status);
$insert_file->bindParam(':did', $did);

$insert_file->execute();

Так что я могу показать pdf-файл в браузере (программа просмотра. php? did = 49):

<?php
require_once("../controller/upload_system_va.php");

$id = intval($_GET['did']);
$PDF = mysqli_fetch_array(get_fileContent($id));
$PDFdata = $PDF['doc_blob'];
?>

...
<div class="viewer">
    <object id="viewer" name="view" data="data:application/pdf;base64,<?php echo $PDFdata ?>" type="application/pdf"></object>
</div>
...

Нажав кнопку подписи, пользователь подписывает документ. Я использую следующую библиотеку для процесса подписания: https://github.com/Communication-Systems-Group/pdfsign.js

Это мой код в подписи. js:

$('#sign_load_btn').click(function () {
    var data = document.getElementById("viewer").data;
    data = convertDataURIToBinary(data);
    pdfSigned = PDFSIGN.signpdf(data, certInput, document.getElementById('password').value);

    sendDataToPHP(pdfSigned);

})

function sendDataToPHP(pdfSigned) {
    //TODO
}

Я пробовал некоторые вещи например, для решения проблемы:

function sendDataToPHP(pdfSigned) {

    if (pdfSigned != 0) {
        $.post("viewer.php", {
            view: true,
            pdfdata: pdfSigned,
        },
        function (data) {
            if (data != "") {
                alert("data sending success");
            } else {
                alert("data sending NOT success");
            }
        }
        );
    }
}

Или код, который я нашел в сети:

function sendDataToPHP(pdfSigned) {
    var base64str = encodeBase64(pdfSigned);
    var binary = atob(base64str.replace(/\s/g, ''));
    var len = binary.length;
    var buffer = new ArrayBuffer(len);
    var viewA = new Uint8Array(buffer);
    for (var i = 0; i < len; i++) {
        viewA[i] = binary.charCodeAt(i);
    }

    var blob = new Blob([viewA], {type: "application/pdf"});

    $.ajax({
        url: 'http://localhost/mythesis/src/controller/upload_syste_va.php',
        data: blob,
        type: 'POST',
        contentType: false,
        processData: false,
        view: true,
        success: function(data) {
            alert("data sending success");
        }
    });
}

в PHP Я получаю array. Тип pdfSigned в JS - object. Я попытался восстановить данные в PHP (uploaded_system_va. php):

if(isset($_POST['view'])) {
    signedDoc_to_db();
}

function signedDoc_to_db() {
    $pdfdata = $_POST['pdfdata'];
    //$pdfdata = $_POST['data'];
    $did = 49;
    //$signed_file = base64_encode(serialize($pdfdata));
    $signed_file = base64_encode($pdfdata);

    $dbcon = new PDO(...);

    if (!$dbcon) {
        die('<p>Fehler beim Verbinden mit der Datenbank!</p>');
    }

    $insert_signedFile = $dbcon->prepare(
        "UPDATE document SET doc_blob = :pdfdata WHERE did = :did"
    );

    $insert_signedFile->bindParam(':pdfdata', $signed_file, PDO::PARAM_LOB);
    $insert_signedFile->bindParam(':did', $did);
    $insert_signedFile->execute();
}

Когда я пытаюсь это сделать таким образом, я сохраняю недопустимый файл BLOB-файла размером 80 байт (я Я требую 300 КиБ для действительного подписанного pdf-файла) в базе данных.

Надеюсь, я мог бы хорошо объяснить мою проблему, и кто-то мог бы помочь.

Привет и извините за мой плохой английский sh ilikefatcats

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...