2011-07-18 51 views
45

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

$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 

下面的代码是作为数据URI的实际图像。 'logoImage'是上面的字符串,$ uri是字符串减去'image/jpeg; base64,'。

+0

对不起,我让一个错字的地方? – GAgnew

+0

您示例中的数据URI不是有效的PNG图像。这将无法正常工作,与代码无关,它与数据有关。 – hakre

+0

您可能希望将其保留为base64图像。我猜,因为我不是一个二元专家,所有在这里给出的例子产生一个32位的结果。从PHP 5.2开始,数据URL应该可以工作,所以解决方案可以非常简单:'file_put_contents('logo.png',preg_replace(/ \ s + /,'+',$ _POST ['logoImage']))'如果您将JavaScript FileReader API与AJAX结合使用。 – PHPglue

回答

61

就让我们来看看at the PHP manual产生如下:

如果您想要保存从一个Javascript canvas.toDataURL()函数得出的数据,你必须空格转换成加分。 如果你不这样做,解码后的数据被破坏:

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

这工作。哇,我不敢相信我以前找不到这个!我会尽快接受这一点,谢谢@Graydot – GAgnew

40

您示例中的数据URI不是有效的PNG图像。这将无法正常工作,与代码无关,它与数据有关。


不适,但可能会感兴趣:

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

背后的想法:PHP本身可以阅读data URIs (data://)内容,所以你并不需要它自己的解码。

请注意,官方数据URI方案(参考号:The "data" URL scheme RFC 2397)在冒号(“:”)之后不包含双斜杠(“//”)。 PHP支持有或没有两个斜杠。

# RFC 2397 conform 
$binary = file_get_contents($uri); 

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

最后:'file_put_contents($ _ POST ['logoFilename'],$ binary);' – andreszs

+0

我们使用PHP 5.5.25,似乎没有必要添加双斜线。 – Andz

+1

@Andz:看起来像使用PHP 5.2+,这一直奏效:http://3v4l.org/Fk4RY - 非常漂亮对PHP.net的评论也已过了几年。不要相信地图,相信地形,再次感谢提示。更正了答案。 – hakre

19

的所有代码,工程:

$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); 
+0

!!我已经在SO和其他地方尝试了TON的答案,这是唯一有效的工作!有效!谢谢。 – Jake