【发布时间】:2014-10-07 11:47:23
【问题描述】:
我正在尝试通过 PHPMailer 从 MySQL 数据库中通过电子邮件发送图像。
目前我将图像从数据库中取出,base64_decode 它,然后将所有空格替换为加号:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfEAAAOzCAYAAACoPT8zAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAP+lSURBVHhe7P3nc13ZdfaL6m+4X/ix69T9oKpzT5U+dp17zzn9+rUkKlOyZbUty2pn+vVrmbYluyV1juxAEgwIBAkSOedABAIgSIJEIgIzmNlJTcWmuiU1Fewz7vOMscZecy+sDQIgWi3qrNn11DNmWGFvovdvjrnWXvsj/8vX90imTJkyZcqU6f7R+Pi46iMf/UaLZMqUKVOmTJnuH73xxhuqj/yvjw5KpkyZMmXKlOn+0S9+8QvVR/4/jx2RTJkyZcqUKdP9o//6r/9SfeR/e/yoZMqUKVOmTJnuH3nJIJ4pU6ZMmTLdZ/KSQTxTpkyZMmW6z+Qlg3imTJkyZcp0n8lLBvFMmTJlypTpPpOXDOKZMmXKlCnTfSYvGcQzZcqUKVOm+0xeMohnypQpU6ZM95m8ZBDPlClTpkyZ7jN5WSXEb8mNaMP88ht568absjl1G5dv+wvpTO1fvf64/Xsy884dGT+U3r9SffLQj+TG+3pyWt5957bUVKWPTVPnD227G3Pp9XX...
然后我使用 PHPMailers AddStringAttachment:
$mail->AddStringAttachment($base64image, "Something Something.png", "base64", "image/png")
这发送正常(还有其他设置,但它们不相关)。但是,一旦我收到电子邮件,它就会说文件已损坏。有谁知道在 PHPMailer 中发送 base64 图像的正确例程?
编辑 1
我删除了对图像的所有修改,现在直接从数据库发送它。结果是:
ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFmRUFBQU96Q0FZQUFBQ29QVDh6QUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBUCBsU1VSQlZIaGU3UDNuYzEzWmRmYUw2bSA0WC9peDY5VDlvS3B6VDVVIGRwMTd6em45IHJVa0tsT3laYlV0eTJwbiB2VnJtYllsdXlWMWp1eEFFZ3dJQkFrU09lZEFCQUlnU0lKRUlnSXptTmxKVGNXbXVpVTFGZXd6N3ZPTXNjWmVjeSBzRFFJZ1dpM3FyTm4xMURObVdHRnZvdmR2anJuV1h2c2ovOHZYOTBpbVRKa3laY3FVNmY3UiBQaTQ2aU1mL1VhTFpNcVVLVk9tVEpudUg3M3h4aHVxai95dmp3NUtwa3laTW1YS2xPbiAwUzkgOFF2VlIvNC9qeDJSVEpreVpjcVVLZFA5by8vNnIvOVNmZVIvZS95b1pNcVVLVk9tVEpudUgzbkpJSjRwVTZaTW1UTGRaL0tTUVR4VHBreVpNbVc2eiBRbGczaW1USmt5WmNwMG44bExCdkZNbVRKbHlwVHBQcE9YRE9LWk1tWEtsQ25UZlNZdkdjUXpaY3FVS1ZPbSAweGVNb2hueXBRcFU2Wk05NW04WkJEUGxDbFRwa3laN2pONVdTWEViOG1OYU1QODhodDU2OGFic2psMUc1ZHYgd3ZwVE8xZnZmNjQvWHN5ODg0ZEdUIFUzcjlTZmZMUWogVEcgM3B5V3Q1OTU3YlVWS1dQVFZQbkQyMjdHM1BwOVhYVHRndFNjIFVYOHU2dmJmOHM3NzczTSBudlBwVSBQbE9tVEpreS9WN0t5enBCM01xUHJpeW1iUE5CNmFyTUtIaC9JelAzQXZGdGI4cGlBT...
尝试打开时仍然会出错。
分辨率
$base = base64_decode($row['image']);
$resource = base64_decode(str_replace(" ", "+", substr($base, strpos($base, ","))));
$mail->addStringAttachment($resource, "Filename.png", "base64", "image/png");
原来我只进行了一次解码,而我需要进行 2 次才能获取二进制数据。感谢那些评论的人。
如果您附加的文件以前是数据 URI,例如直接从 javascript 作为字符串发布,您可能不需要双重解码:
$base = $_POST['image'];
$resource = base64_decode(str_replace(" ", "+", substr($base, strpos($base, ","))));
$mail->addStringAttachment($resource, "Filename.png");
【问题讨论】:
-
你在这里做什么?不要乱用图像文件。您可以附加原始图像并发送它。 PHPMailer 为您处理任何所需的编码。
-
我的图片周围的代码是:
$resource = str_replace(" ", "+", base64_decode($row['image'])); -
你为什么要这么做?从二进制数据中去除“空格”不会有好的结果。如果数据在 MySQL 中是 base-64 编码的,那么你做错了 - 你应该直接存储不编码的二进制文件。
-
@Synchro 我使用 Javascript
FileReader.readAsDataURL(file)通过 POST 请求上传数据,然后将其存储在一个 blob 中,然后将其拉出。 -
这对我有用:
$img = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $baseImage));和你的$mail->AddStringAttachement($img, "Filename.png", "base64", "image/png");谢谢
标签: php mysql email base64 phpmailer