Intervención de imágenes con almacenamiento de Laravel 5.4

Estoy usando la fachada de almacenamiento para almacenar un avatar que funciona bien, pero quiero cambiar el tamaño de mi imagen como lo hice en versiones anteriores de laravel. ¿Cómo puedo hacer esto? Esto es lo que tengo hasta ahora (no funciona)

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

Mensaje de error:

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

Estás tratando de pasar al objeto incorrecto putFile. Ese método espera objeto de archivo (no imagen).

 $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, ahora que entendemos la razón principal, vamos a arreglar el código

 // 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; 

Imaginemos que desea utilizar la fachada de almacenamiento:

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

Lo hago de esta manera:

  1. Cambia el tamaño y guarda la imagen en algún lugar (como en la carpeta pública).
  2. Cree un nuevo archivo y páselo a las funciones del sistema de archivos Laravel (como putFileAs).
  3. Eliminar archivo de intervención temporal.

Nota: Por supuesto que puedes modificarlo de acuerdo a tus necesidades.

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

El método put funciona con la salida de intervención de imagen. El método putFile acepta una instancia de Illuminate \ Http \ File o 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); 

El código anterior cambia el tamaño del archivo cargado a 400px de ancho mientras mantiene la relación de aspecto. Luego codifica a jpg al 80% de calidad. El archivo se almacena en el disco público. Tenga en cuenta que debe proporcionar un nombre de archivo, no solo el directorio.

Asegúrese de agregar el use Illuminate\Http\File; en la parte superior de su archivo para que esto funcione, y lea la sección de documentación Transmisión automática .

Esto supone que quieres todos los jpegs

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

Así es como lo estoy haciendo en mi aplicación con comentarios para ayudar.

 // 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]); 

Lo he hecho de la siguiente manera, es simple y sin ningún tipo de confusión de ruta:

 //Get file $path= $request->file('createcommunityavatar'); // Resize and encode to required type $img = Image::make($file)->fit(300)->encode('jpg'); //Provide own name $name = time() . '.jpg'; //Put file with own name Storage::put($name, $img); //Move file to your location Storage::move($name, 'public/image/' . $name); 

Intente actualizar la extensión GD para la versión php actual.

Si eso no ayuda, intente guardar la imagen redimensionada en el disco local y usar Storage :: putFile.

Puede eliminar el archivo una vez que se haya cargado en su ruta de almacenamiento.

El segundo parámetro de su método putFile es una instancia de la clase de Intervención de imagen. Debe pasar esto como el segundo parámetro al método putFile.

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

No puede almacenar un objeto \ Intervention \ Image \ Image directamente con el sistema de archivos Laravel 5. Lo que puede hacer es cambiar el tamaño de la imagen de su solicitud y guardarla en la misma ruta tmp. Luego simplemente almacene el archivo cargado (sobrescrito) en el sistema de archivos.

Código:

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