Передача данных JSON из JS в PHP

#javascript #php #json #phpmailer #html2pdf

#javascript #php #json #phpmailer #html2pdf

Вопрос:

Искал различные решения, но пока не нашел ни одного. Я застрял со следующим фрагментом кода, и я подозреваю, что jsondata, поступающие в скрипт hphp, пусты, но я понятия не имею, как отлаживать, поскольку этот скрипт выполняется только в фоновом режиме.

Javascript:

  var pdfdata = {};
    
function SendMail(){
    let el = document.getElementById('content');
    let el2 = document.getElementById("tilaus");
    let opt = {
        margin:       1,
        filename:     'myfile.pdf',
        image:        { type: 'jpeg', quality: 0.98 },
        html2canvas:  { scale: 2 },
        jsPDF:        { unit: 'mm', format: 'A4', orientation: 'portrait' }
    };
    
    html2pdf().set( opt ).from( el ).toPdf().output('datauristring').then(function( pdfAsString ) {
        pdfdata["tilaus"] = {
            'fileDataURI': pdfAsString,
    
        };
        //$.post( "../Laskuri/php/send_script.php", data);
    } );
    html2pdf().set( opt ).from( el2 ).toPdf().output('datauristring').then(function( pdfAsString ) {
          pdfdata["tilausvahvistus"] = {
             'fileDataURI2': pdfAsString,
    
         };
     } );
    var jsondata = JSON.stringify(pdfdata);
    console.log( JSON.stringify(pdfdata, null, "    ") );
    $.post( "../Laskuri/php/send_script.php", jsondata);
    }
 

А затем на стороне PHP:

 <?php 
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;

require './src/Exception.php';
require './src/PHPMailer.php';
        $array = json_decode($_POST["jsondata"],true);
            $mail = new PHPMailer;
            $mail->setFrom( 'asiakas@kajonsteel.fi', 'website' );
            $mail->addAddress( 'myynti@kajonsteel.fi', 'Kajon Steel Oy' );
            $mail->Subject  = 'Tilaus';
            $mail->Body     = 'Kiitos tilauksesta. Liitteenä tilausvahvistus ja tilaus.';

            $pdfdoc         = $array->tilaus->fileDataURI;
            $b64file        = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc ) );
            $b64file        = str_replace( ' ', ' ', $b64file );
            $decoded_pdf    = base64_decode( $b64file );
    
            $pdfdoc2         = $array->tilausvahvistus->fileDataURI2; 
            $b64file2        = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc2 ) );
            $b64file2        = str_replace( ' ', ' ', $b64file2 );
            $decoded_pdf2    = base64_decode( $b64file2 );

            $mail->addStringAttachment($decoded_pdf2, "tilausvahvistus.pdf");
        $mail->addStringAttachment($decoded_pdf, "tilaus.pdf");
            $mail->isHTML( true );
            $mail->send();
?>
 

Правильно ли я обращаюсь к jsondata?
консоль.журнал выдает пустой набор в первый раз, но если я снова нажму кнопку, которая активирует sendMail(), то консоль.журнал показывает, что он заполнен правильно (и это второе электронное письмо также повредило PDF-файлы).

Комментарии:

1. Код не отправляет данные на сервер. Метод jQuery post отправляет данные, используя тип enc application/x-www-form-urlencoded. Это означает, что строка JSON, которую вы отправляете на свой сервер, обрабатывается на сервере как имя поля формы, но в поле нет данных. Если вы хотите прочитать одно значение из $_POST , вы должны отправить это значение: const data = 'jsondata=' jsondata; , и передать data вместо pdfdata . Таким образом, ваш сервер может найти $_POST["jsondata"] и правильно декодировать их.

2. Привет! Я думаю, вы имели в виду следующее? var jsondata = JSON.stringify(pdfdata); const data = ‘jsondata=’ jsondata; $.post( «../Laskuri/php/send_script.php «, данные);`

3. Да, точно. Таким образом, формат данных, отправляемых на сервер, будет правильным. Возможно, вы также захотите закодировать данные, 'jsondata=' encodeURIComponent(jsondata); не так ли.

4. Однако файлы pdf по-прежнему отображаются как поврежденные. Правильный ли мой способ доступа к jsondata? pdfdata — это, по сути, объект объектов.

5. Я не знаком с html2pdf, поэтому не могу сказать. Если кодирование данных не устраняет проблему, вам придется подождать, пока кто-нибудь, знающий html2pdf, не ответит на вопрос.

Ответ №1:

Мне удалось использовать обходной путь, чтобы исправить это. Проблема, с которой я столкнулся, заключалась в том, что я дважды вызывал один и тот же php-скрипт, каждый раз вводя значение. Я исправил это, запустив переменные сеанса и дождавшись, пока они оба «заполнятся», прежде чем отправлять электронное письмо.

JS:

 function SendMail(){

let el = document.getElementById('content');
let el2 = document.getElementById("tilaus");
let opt = {
    margin:       1,
    filename:     'myfile.pdf',
    image:        { type: 'jpeg', quality: 0.98 },
    html2canvas:  { scale: 2 },
    jsPDF:        { unit: 'mm', format: 'A4', orientation: 'portrait' }
};

html2pdf().set( opt ).from( el ).toPdf().output('datauristring').then(function( pdfAsString ) {
    //pdfdata.tilaus = {
    let data={
        'fileDataURI': pdfAsString,

    };
    $.post( "../Laskuri/php/send_script.php", data);
} );
html2pdf().set( opt ).from( el2 ).toPdf().output('datauristring').then(function( pdfAsString ) {
      let data = {
         'fileDataURI2': pdfAsString,
     };
     $.post( "../Laskuri/php/send_script.php", data);
 } );


}
 

PHP:

 <?php 
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
require './src/Exception.php';
require './src/PHPMailer.php';
session_start();
            $mail = new PHPMailer;
            $mail->setFrom( 'asiakas@kajonsteel.fi', 'website' );
            $mail->addAddress( 'myynti@kajonsteel.fi', 'Kajon Steel Oy' );
            $mail->Subject  = 'Tilaus';
            $mail->Body     = 'Kiitos tilauksesta. Liitteenä tilausvahvistus ja tilaus.';

        if(isset($_POST["fileDataURI"])){
        $_SESSION["fileDataURI"] = $_POST["fileDataURI"];
        }
        $pdfdoc = $_SESSION["fileDataURI"];
            $b64file        = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc ) );
            $b64file        = str_replace( ' ', ' ', $b64file );
            $decoded_pdf    = base64_decode( $b64file );

        if(isset($_POST["fileDataURI2"])){
        $_SESSION["fileDataURI2"] = $_POST["fileDataURI2"];
        }
        $pdfdoc2 = $_SESSION["fileDataURI2"];   
            $b64file2        = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc2 ) );
            $b64file2        = str_replace( ' ', ' ', $b64file2 );
            $decoded_pdf2    = base64_decode( $b64file2 );
            $mail->addStringAttachment($decoded_pdf2, "tilausvahvistus.pdf");
        $mail->addStringAttachment($decoded_pdf, "tilaus.pdf");
            $mail->isHTML( true );
            if(!empty($decoded_pdf) and !empty($decoded_pdf2)){ 
        $mail->send();
        session_destroy();
        }
?>