Base64 解码到文件 - 缺少什么?
Base64Decode to file - whats missing?
我在 $_POST 字段中有 base64 编码的字符串 $_POST['nimage']
如果我直接将它作为 img
标记中的 src 值回显,我在浏览器中看到的图像就很好:echo "<img src='".$_POST['nimage']."'>";
现在,我显然遗漏了一个步骤,因为当我 base64_decode
字符串并将其写入服务器本地文件时,尝试在浏览器中查看创建的文件状态错误:
"The image 'xxxx://myserversomewhere.com/images/img1.jpg' cannot be displayed because it contains errors"
我的解码和文件放置是:
$file = base64_decode($_POST['nimage']);
file_put_contents('images/'. $_POST['imgname'], $file);
这导致在本地服务器上出现 images/img1.jpg
。我在这里的解码中做错了什么?尽管 base64 输出似乎没有经过 URL 编码,但我在 base64_decode() 之前首先尝试了 urldecode() 只是为了安全测量并得到相同的结果。
base64 编码的前几行是:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAF4AqsDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2gJt+XPJPUGv2A/NB2044oAdtY9M8ccCgB6r8+0jtSYDxEW4xz2qQFCnGOPQ0AAQDJIz9KAF8rI6/hQA9Y+SBgjHIqWA5Yxz2xUsBwUdAMdzSAcFGAB0NADgCVK/KB/OgB6BNzc49agse2OgX2BFZvcCRUO7g
您正在解码的数据附加了一个数据 URI header:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...
浏览器使用 header 来识别文件类型和编码,但不是编码数据的一部分。
从数据中删除 header (data:image/jpeg;base64,
) 并在将其写入文件之前对其余部分进行 base64 解码:您应该可以开始了。
$b64 = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...';
$dat = explode(',' $b64);
// element 1 of array from explode() contains B64-encoded data
if (($fileData = base64_decode($dat[1])) === false) {
exit('Base64 decoding error.');
}
file_put_contents($someFileName, $fileData);
注意:检查您对 base64_decode()
的 false
调用的 return 值,并以某种方式中止消息。它将捕获解码过程中的任何问题(比如不删除 header!)。
我在 $_POST 字段中有 base64 编码的字符串 $_POST['nimage']
如果我直接将它作为 img
标记中的 src 值回显,我在浏览器中看到的图像就很好:echo "<img src='".$_POST['nimage']."'>";
现在,我显然遗漏了一个步骤,因为当我 base64_decode
字符串并将其写入服务器本地文件时,尝试在浏览器中查看创建的文件状态错误:
"The image 'xxxx://myserversomewhere.com/images/img1.jpg' cannot be displayed because it contains errors"
我的解码和文件放置是:
$file = base64_decode($_POST['nimage']);
file_put_contents('images/'. $_POST['imgname'], $file);
这导致在本地服务器上出现 images/img1.jpg
。我在这里的解码中做错了什么?尽管 base64 输出似乎没有经过 URL 编码,但我在 base64_decode() 之前首先尝试了 urldecode() 只是为了安全测量并得到相同的结果。
base64 编码的前几行是:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAF4AqsDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2gJt+XPJPUGv2A/NB2044oAdtY9M8ccCgB6r8+0jtSYDxEW4xz2qQFCnGOPQ0AAQDJIz9KAF8rI6/hQA9Y+SBgjHIqWA5Yxz2xUsBwUdAMdzSAcFGAB0NADgCVK/KB/OgB6BNzc49agse2OgX2BFZvcCRUO7g
您正在解码的数据附加了一个数据 URI header:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...
浏览器使用 header 来识别文件类型和编码,但不是编码数据的一部分。
从数据中删除 header (data:image/jpeg;base64,
) 并在将其写入文件之前对其余部分进行 base64 解码:您应该可以开始了。
$b64 = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...';
$dat = explode(',' $b64);
// element 1 of array from explode() contains B64-encoded data
if (($fileData = base64_decode($dat[1])) === false) {
exit('Base64 decoding error.');
}
file_put_contents($someFileName, $fileData);
注意:检查您对 base64_decode()
的 false
调用的 return 值,并以某种方式中止消息。它将捕获解码过程中的任何问题(比如不删除 header!)。