2014-11-06 11 views
6

Wysyłam plik obrazu png do kontrolera w base64 przez Ajax. Już testowałem i jestem pewien, że kontroler otrzymał identyfikator, ale nadal nie może go zapisać w folderze publicznym.Laravel: Zapisz plik Basepp .png do folderu publicznego ze sterownika

Oto mój kontroler

public function postTest() { 
     $data = Input::all(); 

     //get the base-64 from data 
     $base64_str = substr($data->base64_image, strpos($data->base64_image, ",")+1); 

     //decode base64 string 
     $image = base64_decode($base64_str); 
     $png_url = "product-".time().".png"; 
     $path = public_path('img/designs/' . $png_url); 

     Image::make($image->getRealPath())->save($path); 
     // I've tried using 
     // $result = file_put_contents($path, $image); 
     // too but still not working 

     $response = array(
      'status' => 'success', 
     ); 
     return Response::json($response ); 
} 

Odpowiedz

4

Jest to prosty błąd.

Niepoprawnie używasz public_path. Powinno być:

$path = public_path() . "/img/designs/" . $png_url; 

Chciałbym również uniknąć Twojej metody wysyłania obrazu. Sprawdź poprawność przesyłania w formularzu i użyj metody Input :: file Laravel.

+0

Dzięki za odpowiedź! Zawsze używam public_path() w ten sposób i działa dobrze. I myślę, że problemem jest również metoda Input :: file. Więc teraz rezygnuję z używania go: P. sprawdź moją odpowiedź! – Expl0de

+0

Ścieżka nie jest problemem i nie jest wymagana, tylko '$ path ="/img/designs/". $ png_url' wystarczy. –

0

Zrobiłem to !! Zmieniłem $data->base64_image na $_POST['base64_image']. I użyj $result = file_put_contents($path, $image); zamiast Image::make($image->getRealPath())->save($path); Ale to nie wygląda jak sposób laravel. Mam inny sposób, który wygląda bardziej elegancko, proszę powiedz mi!

+0

Twój problem to '$ data-> base64_image', powinien to być' $ data ['base64_image'] ', sprawdź moją odpowiedź. –

0

Właściwie Input::all() zwraca array wejść więc masz następujące elementy:

$data = Input::all(); 

teraz Twój $data to nie tablica obiekt więc próbujesz uzyskać dostęp do obrazu jako przedmiotu jak:

$data->base64_image 

To nie działa. Należy spróbować użyć:

$image = $data['base64_image']; 

Ponieważ jest to (base64_image) dostępny od $_POST następnie Input::file('base64_image') nie zadziała, ponieważ Input::file('base64_image') sprawdza tablicy $_FILES i go nie ma w Twoim przypadku.

+0

Dzięki za wskazanie tego! Używam Twojej metody z '$ result = file_put_contents ($ path, $ image); 'Teraz budowany jest obraz png. Ale plik jest nieczytelny. Czy '$ data ['base64_image']' jest już plikiem do zapisania? – Expl0de

+0

Prawdopodobnie nie, użyłeś '$ base64_str'? –

+1

Tak, ale nadal nieczytelne. FYI, base64_image wygląda następująco "dane: image/png: base64, iVBORwOkG .....". – Expl0de

2
$data = Input::all(); 
$png_url = "perfil-".time().".jpg"; 
$path = public_path() . "/img/designs/" . $png_url; 
$img = $data['fileo']; 
$img = substr($img, strpos($img, ",")+1); 
$data = base64_decode($img); 
$success = file_put_contents($path, $data); 
print $success ? $png_url : 'Unable to save the file.'; 
+0

w '$ img = $ data [' fileo '];' co reprezentuje $ data ['fileo']? –

6

Interwencja Obraz pobiera dane binarne za pomocą funkcji file_get_content: referencyjny: http://image.intervention.io/api/make

Kontroler powinien wyglądać następująco:

public function postTest() { 
    $data = Input::all(); 
    $png_url = "product-".time().".png"; 
    $path = public_path().'img/designs/' . $png_url; 

    Image::make(file_get_contents($data->base64_image))->save($path);  
    $response = array(
     'status' => 'success', 
    ); 
    return Response::json($response ); 
} 
0

co robię korzysta podstawowym sposobem

$file = base64_decode($request['profile_pic']); 
      $folderName = '/uploads/users/'; 
      $safeName = str_random(10).'.'.'png'; 
      $destinationPath = public_path() . $folderName; 
      file_put_contents(public_path().'/uploads/users/'.$safeName, $file); 

      //save new file path into db 
      $userObj->profile_pic = $safeName; 
     } 
0

Moje rozwiązanie to:

public function postTest() { 
     $data = Input::all(); 

     //get the base-64 from data 
     $base64_str = substr($data->base64_image, strpos($data->base64_image, ",")+1); 

     //decode base64 string 
     $image = base64_decode($base64_str); 
     Storage::disk('local')->put('imgage.png', $image); 
     $storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix(); 
     echo $storagePath.'imgage.png'; 
     $response = array(
      'status' => 'success', 
     ); 
     return Response::json($response ); 
} 
Powiązane problemy