2011-07-18 58 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