2016-08-12 12 views
11

Mam mały problem dotyczący zmiany rozmiaru obrazu, próbuję przesłać formularz zawierający typ danych wejściowych -> plik < - Udało mi się przesłać obraz bez zmiany rozmiaru go, po czym postanowiłem zmienić wielkość tego obrazu, więc zainstalowałem bibliotekę Interwencja obraz za pomocą:Źródło obrazu nieczytelne w Laravel 5.2 - Obraz interwencji

composer require intervention/image 

potem zintegrowana bibliotekę do mojego ram laravel

Intervention\Image\ImageServiceProvider::class 
'Image' => Intervention\Image\Facades\Image::class 

i wreszcie skonfigurowany to tak jak po

php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5" 

mój kontroler jest jak następuje

<?php 
namespace App\Http\Controllers; 
use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Input; 
use Image; 

class ProjectController extends Controller{ 

public function project(Request $request){ 


    $file = Input::file('file'); 
    $fileName = time().'-'.$file->getClientOriginalName(); 

    $file -> move('uploads', $fileName); 
    $img=Image::make('public/uploads/', $file->getRealPath())->resize(320, 240)->save('public/uploads/',$file->getClientOriginalName()); 

} 
} 

ale zamiast rozmiaru pic następujący wyjątek Throwed

NotReadableException in AbstractDecoder.php line 302: 
Image source not readable 
+0

mógłbyś sprawdzić ten [Odpowiedź] (http://stackoverflow.com/questions/33468437/getting-error-notreadableexception-in-abstractdecoder-php-line-302/33469360#33469360)? –

+0

Problem w tym kodzie polega na tym, że $ file-> getRealPath() zawsze zwraca wartość false, jeśli istnieje wcześniejsze wywołanie $ file-> move() –

+0

Czy to możliwe, że nie masz uprawnień (chmod 600)? A może php.ini -> php_value post_max_size (może obraz jest za duży)? –

Odpowiedz

9

Jeżeli nie byłoby Image::make($file->getRealPath()) zamiast Image::make('public/uploads/', $file->getRealPath())?

Image::make() nie wydaje się brać dwóch argumentów, więc to może być twój problem.

Spróbuj tego:

$file = Input::file('file'); 
$fileName = time() . '-' . $file->getClientOriginalName(); 

$file->move('uploads', $fileName); 

$img = Image::make($file->getRealPath()) 
    ->resize(320, 240) 
    ->save('public/uploads/', $file->getClientOriginalName()); 

Albo, jeśli chcesz to zrobić bez uprzedniego przenoszenia pliku, spróbuj tego:

$file = Input::file('file'); 
$img = Image::make($file) 
    ->resize(320, 240) 
    ->save('public/uploads/', $file->getClientOriginalName()); 
+1

Nop, to nie działa już próbowałem. '' Image :: make ($ file-> getRealPath()) '' OR '' Image :: make ($ file) '' daje błąd jako '' Źródło obrazu nieczytelne''. Pracował w Laravel 5, ale nie w L5.2. – Tarunn

+0

Czy sprawdziłeś, czy plik rzeczywiście tam jest, ręcznie przeglądając katalog? Spróbuj także użyć debuggera, aby wykonać kod i zobaczyć, co się naprawdę dzieje. – borfast

+0

@ Tarunn Mam wyjaśnienie w tej odpowiedzi https://stackoverflow.com/questions/38923863/image-source-not-readable-in-laravel-5-2-intervention-image/45768289#45768289 –

2

W L5.2 jej bezpośrednio nie można uzyskać obraz z Input fasada. W tym celu najpierw musimy zapisać obraz na serwerze, a następnie podać ścieżkę do fasady Image, aby wykonać operacje na obrazie.

Kod idzie to lubi:

if ($request->hasFile('picture')) { 

     $destinationPath = public_path('uploads/user'); 
     $photoname = date("YmdHis"); 
     $file_extention = '.'.$request->file('picture')->getClientOriginalExtension(); 
     $photo = $photoname.$file_extention; 
     $file_check = $request->file('picture')->move($destinationPath, $photo); 

     $thumb_path = $destinationPath.'/thumbnail/'.$photo; 

     $new_filePath = $destinationPath.'/'.$photo; 

     $assets_path = url('uploads/user/'); 

     $img = Image::make($assets_path.'/'.$photo)->fit(100)->save($thumb_path,40); 

     $data['picture'] = $photo;   
    } 

szukałem bezpośredniego rozwiązania czyli jak to było możliwe wcześniej podjąć obrazu bezpośrednio z Input elewacji. Jeśli ktokolwiek z was ma bezpośrednie rozwiązanie, pokaż tutaj swój kod, a ja nagrodzę cię tą nagrodą. Twoje zdrowie.

+0

Wydaje się, że być tym, co oryginalny plakat już robił i najwyraźniej nie działał. – borfast

0

Przesyłanie pliku i rozmiaru przed oszczędność jest takie proste: (bez zatwierdzania lub czeków)

można bezpośrednio przejść instancję UploadedFile do InterventionImage :: uczynić()

public function upload(Request $request) 
{ 
    $file = $request->file('file'); 

    $filename = $file->getClientOriginalName(); 

    $img = \Image::make($file); 
    $img->resize(320, 240)->save(public_path('uploads/'.$filename)) 

} 

Jeśli chcesz zachować oryginalny rozmiar i przeskalowane zdjęcie:

$img->save(public_path('uploads/'.$filename)) 
     ->resize(320, 240) 
     ->save(public_path('uploads/thumb_'.$filename)); 

To właśnie testowane na obecnie najnowsza wersja 5.2 z wersją 5.2.45

[EDIT:]

Jeśli zadzwonisz

$file->move(); 

Nie używaj

$file->getRealPath() 

potem, bo to będzie return false po wywołaniu ruchu()

$filename = $file->getClientOriginalName(); 
    $file->move('uploads', $filename); 
    dd($file->getRealPath()); 
0

wystąpił Ten problem przy zmianie rozmiaru obrazu po przeniesieniu go

$file->move('uploads', $fileName);

$file->getRealPath() powróci false po przeniesieniu obrazu. Musisz zmienić rozmiar obrazu przed procesem przenoszenia. To wszystko;)

$img=Image::make('public/uploads/', $file->getRealPath())->resize(320, 240)->save('public/uploads/',$file->getClientOriginalName()); 
$file->move('uploads', $fileName); 
Powiązane problemy