JS / PHP Base64图像显示为黑色

时间:2015-08-25 13:31:14

标签: php angularjs base64 phpmailer

所以我有一个基于AngularJS的混合移动应用程序,我正在尝试将一个Base64编码的图像发送到PHP Web服务,将其嵌入到电子邮件中(使用PHPMailer)。唯一的问题是每次图像都显示为黑色方块。我已经尝试了很多不同的编码/解码方法,但没有任何作用。这是我的代码:

JS:

   encodeImageUri: function(imageUri)
        {
            var c=document.createElement('canvas');
            var ctx=c.getContext("2d");
            var img=new Image();
            img.onload = function(){
                c.width=this.width;
                c.height=this.height;
                ctx.drawImage(img, 0,0);
            };
            img.src=imageUri;
            var dataURL = c.toDataURL("image/jpeg");
            return dataURL;
          }
          //send dataURL with $http.post()

PHP:

    $postdata = file_get_contents("php://input");
    if (isset($postdata)) {
        $request = json_decode($postdata);
        $imageData = $request->imageData;
        $body = "";
        if($imageData != ""){
           $imageHTML ="<img src=\"".$imageData."\"/>";
           $body = $body.$imageHTML;
        } 
    }
    //send email with $body with PHP mailer..

这是$ imageData:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCACWASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8qqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/2Q==

请帮忙吗?

编辑:原来问题是编码。我将cordova相机的选项更改为destinationType: Camera.DestinationType.DATA_URL女巫不需要编码。工作就像一个魅力。

1 个答案:

答案 0 :(得分:0)

简而言之,电子邮件中的数据URI值得避免。 PHPMailer有一个内置的转换器,从数据URI到嵌入式图像,作为msgHTML函数的一部分,所以尝试使用它。或者,您自己进行转换 - PHP has a built-in data converter您可以使用:

$rawimagedata = file_get_contents($imagedata);
$mail->addStringEmbeddedImage($rawimagedata, 'image1', 'myimage', 'base64', 'image/png');

您可能会发现msgHtml()更容易,因为它负责命名所有内容并设置内容ID。

@charlietfl所说的部分是正确的 - 许多客户端不支持数据URI ,但几乎所有客户端都支持嵌入式图像 - 多年来它只是 方式的图像得到了支持!