PHP Data-URI到文件

我有一个数据URI,我从JavaScript获得,并尝试通过PHP保存。 我使用下面的代码给出了一个明显损坏的图像文件:

$data = $_POST['logoImage']; $uri = substr($data,strpos($data,",")+1); file_put_contents($_POST['logoFilename'], base64_decode($uri)); data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs 9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxklEQVQYlYWQMW7CUBBE33yITYUUmwbOkBtEcgUlTa7COXIVV5RUkXKC5AxU EdyZVD4kyKxkwIrr9vd0c7Oih aopinLNsF6Qkg2XW4XJ7LGFsAAcTV6lF5/jLdbALA9XDAXYfthFQVx OrmqKYK88/7rbbMFksALieTnzu9wDYTj6f70PKsp2kwAiSvjXNcvkWpAfNZkzWa/5a9yT7fdoX7rrB7hYh2fXo9HdjPYQZu3MIU8bYIlW20y0RUlXG2Kpv/vfwLxhTaSQwWqwhAAAAAElFTkSuQmCC 

代码下面是实际的图像作为Data-URI。 'logoImage'是上面的string,$ uri是string减去'image / jpeg; base64,'。

快速浏览一下PHP手册可以得到以下结果:

如果要保存从Javascript canvas.toDataURL()函数派生的数据,则必须将空白转换为加号。 如果你不这样做,解码的数据是损坏的:

 <?php $encodedData = str_replace(' ','+',$encodedData); $decodedData = base64_decode($encodedData); ?> 

您的示例中的数据URI不是有效的PNG图像。 这将永远不会工作,并与代码无关,它与数据有关。


不适用,但可能有兴趣:

 file_put_contents($_POST['logoFilename'], file_get_contents($data)); 

背后的想法:PHP本身可以读取数据URI( data:// )的内容,所以你不需要自己解码。

请注意,官方数据URIscheme(参考: “数据”URLschemeRFC 2397 )在冒号(“ : ”)之后不包括双斜杠(“ // ”)。 PHP支持有或没有两个斜杠。

  # RFC 2397 conform $binary = file_get_contents($uri); # with two slashes $uriPhp = 'data://' . substr($uri, 5); $binary = file_get_contents($uriPhp); 

所有工作的代码:

 $imgData = str_replace(' ','+',$_POST['image']); $imgData = substr($imgData,strpos($imgData,",")+1); $imgData = base64_decode($imgData); // Path where the image is going to be saved $filePath = $_SERVER['DOCUMENT_ROOT']. '/ima/temp2.png'; // Write $imgData into the image file $file = fopen($filePath, 'w'); fwrite($file, $imgData); fclose($file);