2013-03-01 108 views
104

我想將我的base64圖像字符串轉換爲圖像文件。這是我的Base64編碼字符串:將Base64字符串轉換爲圖像文件?

http://pastebin.com/ENkTrGNG

使用下面的代碼把它轉換成一個圖像文件:

function base64_to_jpeg($base64_string, $output_file) { 
    $ifp = fopen($output_file, "wb"); 
    fwrite($ifp, base64_decode($base64_string)); 
    fclose($ifp); 
    return($output_file); 
} 

$image = base64_to_jpeg($my_base64_string, 'tmp.jpg'); 

但我得到的invalid image錯誤,什麼是錯在這裏嗎?

+0

的[如何保存爲PNG圖像服務器端,從一個base64數據串]可能的複製(https://stackoverflow.com/questions/ 11511511/how-to-save-a-png-image-server-side-from-base64-data-string) – nyedidikeke 2017-06-27 10:56:24

回答

187

問題是data:image/png;base64,包含在編碼的內容中。這會在base64函數解碼時導致無效的圖像數據。在解碼字符串之前刪除函數中的數據,就像這樣。

function base64_to_jpeg($base64_string, $output_file) { 
    // open the output file for writing 
    $ifp = fopen($output_file, 'wb'); 

    // split the string on commas 
    // $data[ 0 ] == "data:image/png;base64" 
    // $data[ 1 ] == <actual base64 string> 
    $data = explode(',', $base64_string); 

    // we could add validation here with ensuring count($data) > 1 
    fwrite($ifp, base64_decode($data[ 1 ])); 

    // clean up the file resource 
    fclose($ifp); 

    return $output_file; 
} 
+16

我有非常智能的解決方案 $ filename_path = md5(time().uniqid())。「 .JPG「; $ decoded = base64_decode($ base64_string_img); file_put_contents(「uploads /".$ filename_path,$ encoded); – 2015-02-06 12:09:11

+0

我剛剛沒有任何前綴左右原始base64數據左右。因此我不得不將$ data [1]更改爲$ data [0]。 – rcpfuchs 2016-04-27 06:05:41

+1

@rcpfuchs如果你剛剛使用base64,那麼需要使用$ data,直接使用它就像寫在問題 – Anant 2017-02-02 16:35:23

38

您需要刪除圖像數據開頭部分的data:image/png;base64,。實際的base64數據是在那之後。

就剝奪一切直至幷包括base64,(調用數據base64_decode())之前,你會被罰款。

6

也許這樣

function save_base64_image($base64_image_string, $output_file_without_extension, $path_with_end_slash="") { 
    //usage: if(substr($img_src, 0, 5) === "data:") { $filename=save_base64_image($base64_image_string, $output_file_without_extentnion, getcwd() . "/application/assets/pins/$user_id/"); }  
    // 
    //data is like: data:image/png;base64,asdfasdfasdf 
    $splited = explode(',', substr($base64_image_string , 5) , 2); 
    $mime=$splited[0]; 
    $data=$splited[1]; 

    $mime_split_without_base64=explode(';', $mime,2); 
    $mime_split=explode('/', $mime_split_without_base64[0],2); 
    if(count($mime_split)==2) 
    { 
     $extension=$mime_split[1]; 
     if($extension=='jpeg')$extension='jpg'; 
     //if($extension=='javascript')$extension='js'; 
     //if($extension=='text')$extension='txt'; 
     $output_file_with_extension=$output_file_without_extension.'.'.$extension; 
    } 
    file_put_contents($path_with_end_slash . $output_file_with_extension, base64_decode($data)); 
    return $output_file_with_extension; 
} 
1
if($_SERVER['REQUEST_METHOD']=='POST'){ 
$image_no="5";//or Anything You Need 
$image = $_POST['image']; 
$path = "uploads/$image_no.png"; 

file_put_contents($path,base64_decode($image)); 
echo "Successfully Uploaded"; 
} 
+3

中一樣歡迎使用Stack Overflow!感謝您的代碼片段,它可能會提供一些有限的即時幫助。通過展示*爲什麼*這是一個很好的解決方案,並且使它對未來的讀者更有用,一個正確的解釋[將大大提高](// meta.stackexchange.com/q/114762)其長期價值其他類似的問題。請[編輯]你的答案以添加一些解釋,包括你所做的假設。 – 2017-10-12 13:13:07

+0

這不是一個答案,甚至與原始問題有關。 – 2018-01-13 20:08:08

相關問題