#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();
}
?>