2013-03-01 21 views
104

Próbuję przekonwertować ciąg znaków obrazu base64 na plik obrazu. To jest mój ciąg Base64:Konwertuj ciąg znaków Base64 na plik obrazu?

http://pastebin.com/ENkTrGNG

Korzystanie poniższy kod, aby przekształcić go w pliku obrazu:

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'); 

Ale otrzymuję błąd invalid image, co niewłaściwy tutaj?

+0

Możliwy duplikat [Jak zapisać PNG po stronie serwera, z ciągiem danych base64] (https://stackoverflow.com/questions/ 11511511/how-to-save-a-png-image-server-side-from-a-base64-data-string) – nyedidikeke

Odpowiedz

187

Problem polega na tym, że kodowana zawartość zawiera kod data:image/png;base64,. Spowoduje to niepoprawne dane obrazu, gdy funkcja base64 go zdekoduje. Usuń te dane z funkcji przed dekodowaniem łańcucha znaków, tak jak to.

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

Mam bardzo inteligentne rozwiązanie $ nazwa_pliku = md5 (time(). Uniqid()). " .jpg "; $ dekodowane = base64_decode ($ base64_string_img); file_put_contents ("uploads /".$ filename_path, $ dekodowany); –

+0

Miałem tylko surowe dane base64 bez żadnego przedrostka. w związku z tym musiałem zmienić dane $ [1] na $ dane [0]. – rcpfuchs

+1

@rcpfuchs, jeśli masz tylko surowe base64, to jaka jest potrzeba użycia danych $, użyj tego bezpośrednio, jak napisane w zadawanym pytaniu – Anant

38

Musisz usunąć część z napisem data:image/png;base64, na początku danych obrazu. Rzeczywiste dane base64 przychodzą później.

Po prostu rozetnij wszystko do i włącznie z base64, (przed wywołaniem base64_decode() na danych), a wszystko będzie dobrze.

6

może jak ten

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

Witamy w Stack Overflow! Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawi (// meta.stackexchange.com/q/114762) jego długoterminową wartość, pokazując * dlaczego * jest to dobre rozwiązanie problemu i sprawiłoby, że byłby bardziej przydatny dla przyszłych czytelników z inne, podobne pytania. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienia, w tym założenia, które podjąłeś. –

+0

To nie jest odpowiedź lub nawet odnosi się do pierwotnego pytania. –