2016-10-13 18 views
10

Używam fasady do przechowywania avatara, która działa dobrze, ale chcę zmienić rozmiar mojego obrazu, tak jak w poprzednich wersjach laravel. Jak mogę to zrobić? Oto co mam tak daleko (nie działa)Interwencja obrazów w/Laravel 5.4 Przechowywanie

$path = $request->file('createcommunityavatar'); 
    $resize = Image::make($path)->fit(300); 
    $store = Storage::putFile('public/image', $resize); 
    $url = Storage::url($store); 

komunikat o błędzie:

Command (hashName) is not available for driver (Gd). 
+0

Cześć, spróbuj tego obrazu :: make ($ path) -> resize (300, 300); – iCoders

+0

To dało mi ten sam błąd co poprzednio. 'Polecenie (hashName) nie jest dostępne dla sterownika (Gd).' – CriticalTheWizard

+0

Czy zostało to rozwiązane? – dbr

Odpowiedz

8

starasz się przekazać do putFile zły przedmiot. Ta metoda oczekuje obiektu File (nie Image).

$path = $request->file('createcommunityavatar'); 

// returns \Intervention\Image\Image - OK 
$resize = Image::make($path)->fit(300); 

// expects 2nd arg - \Illuminate\Http\UploadedFile - ERROR, because Image does not have hashName method 
$store = Storage::putFile('public/image', $resize); 

$url = Storage::url($store); 

Ok, teraz kiedy zrozumiemy, że głównym powodem, niech ustalić kod

// returns Intervention\Image\Image 
$resize = Image::make($path)->fit(300)->encode('jpg'); 

// calculate md5 hash of encoded image 
$hash = md5($resize->__toString()); 

// use hash as a name 
$path = "images/{$hash}.jpg"; 

// save it locally to ~/public/images/{$hash}.jpg 
$resize->save(public_path($path)); 

// $url = "/images/{$hash}.jpg" 
$url = "/" . $path; 

Wyobraźmy sobie, że chcesz użyć fasadę Przechowywanie:

// does not work - Storage::putFile('public/image', $resize); 

// Storage::put($path, $contents, $visibility = null) 
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString()); 
+0

Powyższy kod działa doskonale bez problemu, z jedną uwagą: 'md5 ($ resize -> __ toString());' zwraca zawsze ten sam skrót dla tego samego pliku, co może być problematyczne w niektórych przypadkach. W moim rozwiązaniu zastąpiłem je: '$ now = Carbon :: now() -> toDateTimeString(); $ hash = md5 ($ image -> __ toString(). $ Now); ' –

0

Spróbuj zaktualizować rozszerzenia GD dla bieżącej wersji PHP.

Jeśli to nie pomoże, spróbuj zapisać obraz o zmienionym rozmiarze na dysku lokalnym i użyj opcji Storage :: putFile.

Możesz usunąć plik po przesłaniu go do swojej ścieżki przechowywania.

Drugi parametr metody putFile jest instancją klasy Image Intervention. Musisz przekazać to jako drugi parametr do metody putFile.

$resize->save($absolutePath . 'small/' . $imageName); 
0

Upewnij się, aby dodać use Illuminate\Http\File; na początku pliku dla tej pracy i przeczytać w sekcji dokumentów Automatic Streaming.

Zakłada chcesz wszystkie JPEG

$path = $request->file('createcommunityavatar'); 
$resize = Image::make($path)->fit(300)->encode('jpg'); 
$filePath = $resize->getRealPath() . '.jpg'; 
$resize->save($filePath); 
$store = Storage::putFile('public/image', new File($resize)); 
$url = Storage::url($store); 

To jak ja to robię w mojej aplikacji z komentarzem pomóc

// Get the file from the request 
$requestImage = request()->file('image'); 

// Get the filepath of the request file (.tmp) and append .jpg 
$requestImagePath = $requestImage->getRealPath() . '.jpg'; 

// Modify the image using intervention 
$interventionImage = Image::make($requestImage)->resize(125, 125)->encode('jpg'); 

// Save the intervention image over the request image 
$interventionImage->save($requestImagePath); 

// Send the image to file storage 
$url = Storage::putFileAs('photos', new File($requestImagePath), 'thumbnail.jpg'); 

return response()->json(['url' => $url]); 
+0

miałeś na myśli '$ filePath = $ resize-> getRealPath(). '.jpg'; ' – CriticalTheWizard

+0

Próbowałem go na świeżej instalacji laravel 5.3. *, to działa. Wypróbowałeś to? – robertmylne

+0

jakiego rodzaju nowego pliku używają tutaj? plik http lub plik fasady? – ClearBoth

0

Nie można zapisać obiekt \ Intervention \ Image \ Image bezpośrednio z systemem plików Laravel 5. Możesz zmienić rozmiar obrazu ze swojej prośby i zapisać go pod tą samą ścieżką. Następnie zapisz przesłany (nadpisany) plik do systemu plików.

Kod:

$image = $request->file('createcommunityavatar'); 
//resize and save under same tmp path 
$resize = Image::make($image)->fit(300)->save(); 
// store in the filesystem with a generated filename 
$store = $image->store('image', 'public'); 
// get url from storage 
$url = Storage::url($store); 
+1

przechowujesz plik bez zmian ... – user3253002

1

umieścić metoda działa z wyjściem interwencyjnej obrazu. Metoda putFile akceptuje instancję Illuminate \ Http \ File lub Illuminate \ Http \ UploadedFile.

$photo = Image::make($request->file('photo')) 
    ->resize(400, null, function ($constraint) { $constraint->aspectRatio(); }) 
    ->encode('jpg',80); 

Storage::disk('public')->put('photo.jpg', $photo); 

Powyższy kod zmienia rozmiar przesłanego pliku na szerokość 400 pikseli przy zachowaniu proporcji. Następnie koduje do formatu jpg z jakością 80%. Plik jest następnie zapisywany na dysku publicznym. Należy podać nazwę pliku, a nie tylko katalog.

1

zrobić to w ten sposób:

  1. Resize i zapisać obraz gdzieś (jak w folderze publicznym).
  2. Utwórz nowy plik i przekaż go do funkcji systemu plików Laravel (takich jak putFileAs).
  3. Usuń plik tymczasowy interwencyjnej

Uwaga: Oczywiście można go modyfikować w zależności od potrzeb.

$file = $request->file('portfolio_thumb_image'); 

$image = Image::make($file); 

$image->resize(570, 326, function ($constraint) { 
    $constraint->aspectRatio(); 
}); 

$thumbnail_image_name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME).'.'.$file->getClientOriginalExtension(); 

$image->save(public_path('images/'.$thumbnail_image_name)); 

$saved_image_uri = $image->dirname.'/'.$image->basename; 

//Now use laravel filesystem. 
$uploaded_thumbnail_image = Storage::putFileAs('public/thumbnails/'.$portfolio_returned->id, new File($saved_image_uri), $thumbnail_image_name); 

//Now delete temporary intervention image as we have moved it to Storage folder with Laravel filesystem. 
$image->destroy(); 
unlink($saved_image_uri);