У меня следующая проблема: у меня есть веб-приложение для подписи 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