带 Laravel 5.4 存储的图像干预
Image Intervention w/ Laravel 5.4 Storage
我正在使用存储外观来存储一个工作正常的头像,但我想像在以前的 laravel 版本中那样调整我的图像大小。
我该怎么做呢?
这是我目前所拥有的(不起作用)
$path = $request->file('createcommunityavatar');
$resize = Image::make($path)->fit(300);
$store = Storage::putFile('public/image', $resize);
$url = Storage::url($store);
错误信息:
Command (hashName) is not available for driver (Gd).
尝试更新当前 php 版本的 GD 扩展。
如果这没有帮助,请尝试将调整后的图像保存在本地磁盘上并使用 Storage::putFile。
上传到您的存储路径后,您可以删除该文件。
putFile 方法的第二个参数是图像干预的实例 class。您需要将其作为第二个参数传递给 putFile 方法。
$resize->save($absolutePath . 'small/' . $imageName);
确保将 use Illuminate\Http\File;
添加到您的文件顶部以使其正常工作,并通读文档部分 Automatic Streaming。
这假设您想要所有 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);
这就是我在我的应用程序中的做法,并附有评论以提供帮助
// 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]);
您试图将错误的对象传递给 putFile。该方法需要文件对象(不是图像)。
$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);
好了,明白了主要原因,我们来修正代码
// 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;
假设您要使用 Storage facade:
// does not work - Storage::putFile('public/image', $resize);
// Storage::put($path, $contents, $visibility = null)
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString());
您不能直接使用 Laravel 5 文件系统存储 \Intervention\Image\Image 对象。您可以做的是根据您的请求调整图像大小,并将其保存在相同的 tmp 路径下。然后将上传(覆盖)的文件存储到文件系统。
代码:
$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);
put 方法与图像干预输出一起使用。
putFile 方法接受 Illuminate\Http\File 或 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);
以上代码将上传文件的大小调整为 400px 宽度,同时保持宽高比。然后以 80% 的质量编码为 jpg。
然后文件存储到 public 光盘。
请注意,您必须提供文件名,而不仅仅是目录。
我是这样做的:
- 调整大小并将图像保存在某处(例如在 public 文件夹中)。
- 创建一个新文件并将其传递给 Laravel 文件系统函数(例如 putFileAs)。
- 删除临时干预文件
注:当然可以根据自己的需要进行修改
$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);
我是用下面的方法搞定的,很简单,没有任何路径混淆:
//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);
我能找到的最简洁的解决方案——使用本机 Storage
外观——如下所示。我可以确认这在 Laravel 5.7 中有效,使用 intervention/image
版本 2.4.2.
$file = $request->file('avatar');
$path = $file->hashName('public/avatars');
$image = Image::make($file)->fit(300);
Storage::put($path, (string) $image->encode());
$url = Storage::url($path);
使用Laravel 5.8
我在尝试 读取 带有 Image
的图像文件时遇到了类似的问题,而这个文件是 保存的 和 加载 与 Storage
.
除了所有答案之外,我不确定为什么它不起作用。
Image
尝试读取文件时出现异常
Intervention\Image\Exception\NotReadableException : Unable to init from given binary data.
简答
添加 ->encode()
解决了问题
http://image.intervention.io/api/encode
场景
基本上我有过这样的测试
Storage::fake();
$photo = factory(Photo::class)->create();
$file = \Image::make(
UploadedFile::fake()->image($photo->file_name, 300, 300)
);
Storage::disk($photo->disk)
->put(
$photo->fullPath(),
$file
);
在控制器中我有这样的东西
return \Image::make(
Storage::disk($photo->disk)
->get(
$photo->fullPath()
)
)->response();
解决方案
经过调查,我意识到任何由 Image
创建并由 Storage
保存的文件的大小为 0 个八位字节 。
在查看了这个 post 中的所有解决方案后,几个小时后,我注意到每个人都在使用 encode()
但没有人提到它是那个。所以我尝试了并且成功了。
再调查一下,Image
实际上在保存之前 encode。
https://github.com/Intervention/image/blob/master/src/Intervention/Image/Image.php#L146
因此,我的解决方案是简单地执行此操作
$file = \Image::make(
\Illuminate\Http\UploadedFile::fake()->image('filename.jpg', 300, 300)
)->encode();
\Storage::put('photos/test.jpg', $file);
可在 Tinker 中测试,它将创建一个黑色图像
在我的例子中,错误是由调用图像实例上的 hashName 方法引起的。
//initially
$image = Image::make(request('image')->getRealPath());
$filename = $image->hashName();
//to fix the error
$image = Image::make(request('image')->getRealPath());
$filename = request('image')->hashName();
我正在使用存储外观来存储一个工作正常的头像,但我想像在以前的 laravel 版本中那样调整我的图像大小。 我该怎么做呢? 这是我目前所拥有的(不起作用)
$path = $request->file('createcommunityavatar');
$resize = Image::make($path)->fit(300);
$store = Storage::putFile('public/image', $resize);
$url = Storage::url($store);
错误信息:
Command (hashName) is not available for driver (Gd).
尝试更新当前 php 版本的 GD 扩展。
如果这没有帮助,请尝试将调整后的图像保存在本地磁盘上并使用 Storage::putFile。
上传到您的存储路径后,您可以删除该文件。
putFile 方法的第二个参数是图像干预的实例 class。您需要将其作为第二个参数传递给 putFile 方法。
$resize->save($absolutePath . 'small/' . $imageName);
确保将 use Illuminate\Http\File;
添加到您的文件顶部以使其正常工作,并通读文档部分 Automatic Streaming。
这假设您想要所有 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);
这就是我在我的应用程序中的做法,并附有评论以提供帮助
// 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]);
您试图将错误的对象传递给 putFile。该方法需要文件对象(不是图像)。
$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);
好了,明白了主要原因,我们来修正代码
// 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;
假设您要使用 Storage facade:
// does not work - Storage::putFile('public/image', $resize);
// Storage::put($path, $contents, $visibility = null)
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString());
您不能直接使用 Laravel 5 文件系统存储 \Intervention\Image\Image 对象。您可以做的是根据您的请求调整图像大小,并将其保存在相同的 tmp 路径下。然后将上传(覆盖)的文件存储到文件系统。
代码:
$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);
put 方法与图像干预输出一起使用。 putFile 方法接受 Illuminate\Http\File 或 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);
以上代码将上传文件的大小调整为 400px 宽度,同时保持宽高比。然后以 80% 的质量编码为 jpg。 然后文件存储到 public 光盘。 请注意,您必须提供文件名,而不仅仅是目录。
我是这样做的:
- 调整大小并将图像保存在某处(例如在 public 文件夹中)。
- 创建一个新文件并将其传递给 Laravel 文件系统函数(例如 putFileAs)。
- 删除临时干预文件
注:当然可以根据自己的需要进行修改
$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);
我是用下面的方法搞定的,很简单,没有任何路径混淆:
//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);
我能找到的最简洁的解决方案——使用本机 Storage
外观——如下所示。我可以确认这在 Laravel 5.7 中有效,使用 intervention/image
版本 2.4.2.
$file = $request->file('avatar');
$path = $file->hashName('public/avatars');
$image = Image::make($file)->fit(300);
Storage::put($path, (string) $image->encode());
$url = Storage::url($path);
使用Laravel 5.8
我在尝试 读取 带有 Image
的图像文件时遇到了类似的问题,而这个文件是 保存的 和 加载 与 Storage
.
除了所有答案之外,我不确定为什么它不起作用。
Image
尝试读取文件时出现异常
Intervention\Image\Exception\NotReadableException : Unable to init from given binary data.
简答
添加 ->encode()
解决了问题
http://image.intervention.io/api/encode
场景
基本上我有过这样的测试
Storage::fake();
$photo = factory(Photo::class)->create();
$file = \Image::make(
UploadedFile::fake()->image($photo->file_name, 300, 300)
);
Storage::disk($photo->disk)
->put(
$photo->fullPath(),
$file
);
在控制器中我有这样的东西
return \Image::make(
Storage::disk($photo->disk)
->get(
$photo->fullPath()
)
)->response();
解决方案
经过调查,我意识到任何由 Image
创建并由 Storage
保存的文件的大小为 0 个八位字节 。
在查看了这个 post 中的所有解决方案后,几个小时后,我注意到每个人都在使用 encode()
但没有人提到它是那个。所以我尝试了并且成功了。
再调查一下,Image
实际上在保存之前 encode。
https://github.com/Intervention/image/blob/master/src/Intervention/Image/Image.php#L146
因此,我的解决方案是简单地执行此操作
$file = \Image::make(
\Illuminate\Http\UploadedFile::fake()->image('filename.jpg', 300, 300)
)->encode();
\Storage::put('photos/test.jpg', $file);
可在 Tinker 中测试,它将创建一个黑色图像
在我的例子中,错误是由调用图像实例上的 hashName 方法引起的。
//initially
$image = Image::make(request('image')->getRealPath());
$filename = $image->hashName();
//to fix the error
$image = Image::make(request('image')->getRealPath());
$filename = request('image')->hashName();