javascript - is_file 在传递的 pdf 文件上失败

标签 javascript php

我正在编写一些代码来获取一个页面,将其转换为 pdf,然后通过电子邮件发送 pdf。我正在使用 html2canvas 和 jsPDF 生成 pdf。然后我将 pdf 发送到 php 脚本来处理它并邮寄它,但这失败了。我知道 pdf 生成是有效的,因为我可以在本地保存 pdf。这是到目前为止我的代码:

JavaScript:

$(document).ready(function() {
    $('#download').click(function() {  
    html2canvas($('#wrapper'), {
        onrendered: function(canvas) {
        var imgData = canvas.toDataURL('image/png');

        var doc = new jsPDF('p','mm');
        doc.addImage(imgData, 'PNG', 10,10);

        var pdfMail = btoa(doc.output());

         $.post("../mailPdf.php",
         {
            data:pdfMail
         },function (response,status) {
                console.log(response);
                 });

    }
});});});

mailPdf.php

function MailWithAttachment($to, $subject, $message, $senderMail, $senderName, $files){

$from = $senderName." <".$senderMail.">"; 
$headers = "From: $from";

// boundary 
$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

// headers for attachment 
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 

// multipart boundary 
$message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 
// preparing attachments
if(count($files) > 0){
    for($i=0;$i<count($files);$i++){
        if(is_file($files[$i])){
            $message .= "--{$mime_boundary}\n";
            $fp =    @fopen($files[$i],"rb");
            $data =  @fread($fp,filesize($files[$i]));
            @fclose($fp);
            $data = chunk_split(base64_encode($data));
            $message .= "Content-Type: application/octet-stream; name=\"".basename($files[$i])."\"\n" . 
            "Content-Description: ".basename($files[$i])."\n" .
            "Content-Disposition: attachment;\n" . " filename=\"".basename($files[$i])."\"; size=".filesize($files[$i]).";\n" . 
            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
        }
    }
}
$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $senderMail;

//send email
$mail = mail($to, $subject, $message, $headers, $returnpath); 

//function return true, if email sent, otherwise return fasle
if($mail){ return TRUE; } else { return FALSE; }
}


if(!empty($_POST['data'])){

//email variables
$to = 'recipient@email.com';
$from = 'sender@email.com';
$from_name = 'From Name';

//attachment files path array
$file = base64_decode($_POST['data']);

$subject = 'PHP Email with attachment'; 
$html_content = '<h1>PHP Email with attachment</h1>';

//call MailWithAttachment() function and pass the required arguments
$send_email = MailWithAttachment($to,$subject,$html_content,$from,$from_name,$file);

//print message after email sent
echo $send_email?"<h1> Mail Sent</h1>":"<h1> Mail not SEND</h1>";

} else {
    echo "No Data Found";
} 

脚本一直运行到 if(is_file($files[$i])){ 循环。 is_file 始终返回 false,并且此循环无法运行。我不明白为什么它无法识别和读取该文件。

最佳答案

php 方面的问题是,在函数 MailWithAttachment 中,您期望 files 参数的数据类型略有不同。

$file = $_POST['data'];实际上不是一个文件,而是一个base64编码的字符串(btoa(doc.output()))。所以你真正想做的是这样的(遵循 MailWithAttachment 函数的签名)。

更改此:

//attachment files path array
$file = $_POST['data'];

像这样:

//attachment file encoded
$files = array();
$file = $_POST['data'];
$filePath = '/tmp/foo.pdf';
// actually here you can do whatever you want. you just need to save file on disk, at least for request context. I think creating file in memory also should work.
file_put_contents($filePath, base64_decode($file));
$files[] = $filePath;
...
// pay attention $file is changed to $files here
MailWithAttachment(...,$files);
...

关于javascript - is_file 在传递的 pdf 文件上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35184325/

相关文章:

javascript - jquery 在点击时更改时间间隔,当点击功能完成时重置为默认值

PHP/MySQL - 如何更新动态添加的行

php - Yii2 - 面临默认密码长度验证问题

javascript - 如何在 Google Sheet 中找到完整删除的脚本?

javascript - ReactJS 使用 redux 正确更新状态

javascript - 如何通过在 Handlebars 中单击来增加图像的大小?

javascript - 如何从 angular.element [jqLit​​e] 更改第二/第三等标签的背景

php - 调用未定义的函数 Project\Http\Controllers\array_sort()

php - APE - Ajax 推送引擎

php - 如何在 Laravel 中显示注册用户数?