XMLHttpRequest отправка .PDF в PHP и сохранение на сервере приводит к повреждению некоторых данных - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть PDF-файл в виде большого двоичного объекта, который я пытаюсь отправить на php, чтобы он был сохранен локально на моем веб-сервере. В настоящее время, если я использую saveAs () для локального сохранения PDF-файла, он будет читаем и не поврежден. Однако, как только данные отправляются в виде форм-данных через мой php-скрипт, они сохраняются в большем размере файла, который имеет потерю данных, и в итоге не может быть открыт в Adobe Reader.

Я просмотрел два файла PDF рядом друг с другом, и вы можете видеть, что символы certian просто не копируются.

Разные PDF-файлы, слева работает PDF, справа повреждена

Я читаю блоб с помощью FileReader и добавляю данные формы с результатом. Затем я использую XMLHttpRequest для отправки данных в мой PDF-файл, где он записывает файл.

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

 function transferData(){              
            var data = new FormData();
            var reader = new FileReader();
            reader.readAsBinaryString(blobHolder);
            reader.addEventListener('loadend',
                    function(){
                    data.append("data" , reader.result);
                    var xhr2 = new XMLHttpRequest();
                    xhr2.open( 'post', 'php/savefile.php', true );
                    xhr2.send(data);
            });
      }
<?php

if(!empty($_POST['data'])){
$data = $_POST['data'];
$fname = "serverGeneratedPDF.pdf";

$file = fopen("../upload/" .$fname, 'w+');
fwrite($file, $data);
fclose($file);
}

?>

1 Ответ

0 голосов
/ 02 мая 2019

Хотел обновить эту проблему так, как я заставил ее работать.

В итоге я отправил весь объект BLOB-объекта как formData, а не с помощью FileReader.В моем PHP-файле я затем использовал функцию file_get_contents (), которая, наконец, спасла день.Он смог вытащить жесткие «данные» из большого двоичного объекта, отправленного через !!!

Обновленный код:

JS:

 function transferData(){              
                    var data = new FormData();
                    data.append('sentBlob', blobHolder);
                    var xhr2 = new XMLHttpRequest();
                    xhr2.open( 'post', 'php/savefile.php', true );
                    xhr2.send(data);
              }

PHP:

<?php

$data = file_get_contents($_FILES['sentBlob']['tmp_name']);
$fname = "serverGeneratedPDF.pdf";

$file = fopen("../upload/" .$fname, 'wb');//creates new file
fwrite($file, $data);
fclose($file);

?>

Моим моментом "ах-ха" было выяснение двух вещей:

  1. Мой BLOB-объект отправлял переменную $ _FILES вместо $ _POST
  2. ОднаждыPHP обработал большой двоичный объект, используя '$ _FILES [] [' tmp_name ']', наконец, способ вывести необработанные двоичные данные из большого двоичного объекта (мне потребовались дни, чтобы добраться до этой точки)

Надеюсь, это кому-нибудь поможет!

...