0

$_POST['nimage']如果我直接将它作为标签中的 src 值回显,我在 $_POST 字段中有base64编码的字符串img,我在浏览器中看到图像就好了:echo "<img src='".$_POST['nimage']."'>";

现在,我显然错过了一步,因为当我base64_decode将字符串写入服务器本地的文件时,尝试在浏览器中查看创建的文件时会出现错误:

“无法显示图像‘xxxx://myserversomewhere.com/images/img1.jpg’,因为它包含错误”

我的解码和文件放置是:

$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

4

1 回答 1

0

您正在解码的数据附加了一个数据 URI 标头:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...

浏览器使用标头来识别文件类型和编码,但不是编码数据的一部分。

从数据中剥离标题 ( 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以某种方式中止一条消息。它将捕获解码过程中的任何问题(例如不删除标头!)。

于 2015-06-08T03:25:33.553 回答