我试图通过电子邮件发送PDF或PNG,但似乎没有工作。下面是我的最后一次尝试,我已经阅读了SO上的每一篇文章,但没有看到任何工作的建议,有人能帮助我吗?我使用的是PHPMailer,html2pdf和html2canvas,这两个软件都能在点击后产生适当的文件,只是把它们发送到php mailer上就不行了。我得到的文件无法打开...... 以下是我最后的尝试......用file_get_contents方法,我得到0大小的数据。
PDF的尝试。
var element = document.getElementById('printableArea');
// var opt = {
// filename: 'nalog.pdf'
// };
html2pdf().from(element).toPdf().output('datauristring').then(function (pdfAsString) {
pdfcontent = pdfAsString.replace(/&/,"%26").replace(/=/,"%3D");
var x = new XMLHttpRequest();
var url = "xxx/mail.php";
x.open("POST", url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send("data="+pdfcontent);
console.log(pdfcontent);
});
PHP。
$mail->AddStringAttachment($_POST['data'],"nalog.pdf");
PNG尝试。
html2canvas($('#printableArea')[0], {
width: 1200
}).then(function(canvas) {
var data = canvas.toDataURL("image/png");
pdfcontent = data.replace(/&/,"%26").replace(/=/,"%3D");
var x = new XMLHttpRequest();
var url = "xxx/mail.php";
x.open("POST", url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.send("data="+pdfcontent);
console.log(pdfcontent);
});
PNG尝试:PHP。
$mail->AddStringAttachment($_POST['data'],"nalog.png");
EDIT:为了更新我的问题,我做了答案中的建议,并尝试调试它,但没有任何帮助。我做了PHP file_put_contents(),并用控制台日志编译,结果是同样的数据。
有其他建议吗?
我的猜测是问题发生在传输过程中,因为URI不能很好地处理二进制数据 - 可能有NUL字符,谁知道还有什么其他的东西在那里,这截断或混乱的数据.尝试发送这样的数据,而不是(作为原始文本,而不是URL编码)。
var x = new XMLHttpRequest();
x.open("POST", "xxx/mail.php", true);
x.setRequestHeader("Content-type", "text/plain; charset=utf-8");
x.send( new Uint8Array(pdfcontent) );
然后,在服务器端,你需要像这样提取这些原始数据。
$data = file_get_contents('php://input');
使用$_POST是不行的,它应该是空的。
如果这仍然产生一个坏的文件,那么可能问题不在传输上.试着把 console.log 打印出来的东西复制+粘贴到一个文件中,看看它是否能被打开(即使数据是有效的,它也可能不工作,因为我们正在处理二进制数据,但如果它确实工作,那么很好--至少我们可以排除源头的问题).然后试着在服务器端使用 file-put-contents (https:/www.php.netmanualenfunction.file-put-contents.php),看看是否会产生一个有效的文件。如果是,那么问题就发生在发送电子邮件的过程中。
在任何情况下,你都应该在服务器端生成文件--所有这些来来回回的过程都是非常低效和不安全的。例如,您可以使用 FPDF (http:/www.fpdf.org)使用PHP从头开始创建一个PDF文件,并通过电子邮件发送。是的,它使你的输出工作增加了一倍,因为你需要分别制作HTML和PDF,但从长远来看,这是非常值得的。或者,在这种设置中,你根本不需要制作HTML?你制作HTML的唯一目的是为了通过电子邮件发送,还是真的需要把它也呈现给用户?
在几乎放弃之后,终于把它弄好了。其结合了这里链接和建议的一些东西。github html2pdf 也帮了点忙。
我把它贴在这里,因为没有一个例子对我有用,我花了两天时间才找到适合我和我的安利。希望能帮到别人。
window.onload = function pdfDivload (){
let el = document.getElementById('printableArea');
let opt = {
margin: 1,
filename: 'myfile.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'A4', orientation: 'portrait' }
};
html2pdf().set( opt ).from( el ).toPdf().output('datauristring').then(function( pdfAsString ) {
let data = {
'fileDataURI': pdfAsString,
};
$.post( "../prog/mail.php", data);
console.log( data );
} );
};
PHP的。
if (isset($_POST['fileDataURI'])) {
$pdfdoc = $_POST['fileDataURI'];
$b64file = trim( str_replace( 'data:application/pdf;base64,', '', $pdfdoc ) );
$b64file = str_replace( ' ', '+', $b64file );
$decoded_pdf = base64_decode( $b64file );
//file_put_contents( $attachment, $decoded_pdf );
$mail = new PHPMailer;
$mail->setFrom( '[email protected]', 'website' );
$mail->addAddress( '[email protected]', 'OdedTa' );
$mail->Subject = 'First PHPMailer Message';
$mail->Body = 'Hi! This is my first e-mail sent through PHPMailer.';
$mail->addStringAttachment($decoded_pdf, "nalog.pdf");
$mail->isHTML( true );
$mail->send();