关于给定图片的大小调整过程,我遇到一个小问题,我正在尝试提交一个包含输入类型的表单 - >文件< - 我可以上传图片而不调整大小,之后我决定调整该图像的大小,因此我使用以下方法安装了干预图像库:
composer require intervention/image
然后我将库集成到我的Laravel框架中
Intervention\Image\ImageServiceProvider::class
'Image' => Intervention\Image\Facades\Image::class
最后我将其配置为以下
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
我的控制器如下所示
<?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());
}
}
但不是调整pic的大小,而是抛出以下异常
NotReadableException in AbstractDecoder.php line 302:
Image source not readable
答案 0 :(得分:12)
不应该是Image::make($file->getRealPath())
而不是Image::make('public/uploads/', $file->getRealPath())
吗?
Image::make()
似乎没有两个参数,所以这可能是你的问题。
试试这个:
$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());
或者如果您想在不先移动文件的情况下执行此操作,请尝试以下操作:
$file = Input::file('file');
$img = Image::make($file)
->resize(320, 240)
->save('public/uploads/', $file->getClientOriginalName());
答案 1 :(得分:2)
在L5.2
中,它无法直接从Input
外观获取图像。为此,我们需要首先将图像存储在服务器上,然后提供进入Image
外观的路径以对图像进行操作。
代码就是这样:
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;
}
我一直在寻找直接解决方案,因为以前可以直接从Input
外观拍摄图像。如果你们中的任何人有直接解决方案,请在此处显示您的代码,我将奖励您这笔赏金。欢呼声。
答案 2 :(得分:1)
当您不想使用
命名上传文件时,也会发生此问题。
$filename = $file->getClientOriginalName();
方法。如果要创建自己的上传文件名,请使用以下方法
// $filename_without_ext = $request->input('name');
$filename_without_ext = Str::slug($request->input('name'));
$file_extension = pathinfo($logo->getClientOriginalName(), PATHINFO_EXTENSION);
$filename = time() . '-' . $filename_without_ext . '.' . $file_extension;
如果您使用Laravel 5.8并遇到该错误,并且试图创建自己的文件名(这是最必要的),则可能会陷入此陷阱。您应该检查名称字段是否作为表单输入。例如,对于上面的代码,如果您不使用Str :: slug函数(这是Laravel的辅助函数),就像带注释的代码一样,由于form字段可能具有空白,您可能会遇到问题。 / p>
答案 3 :(得分:0)
在保存之前上传文件并调整其大小就像这样简单: (未经验证或检查)
您可以直接将UploadedFile的实例传递给InterventionImage :: make()
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))
}
如果要保存原始尺寸并调整图像大小:
$img->save(public_path('uploads/'.$filename))
->resize(320, 240)
->save(public_path('uploads/thumb_'.$filename));
这只是在目前最新的5.2版本上测试的,是5.2.45
[编辑:
如果你打电话
$file->move();
不要使用
$file->getRealPath()
之后,因为在调用move()
之后这将返回false $filename = $file->getClientOriginalName();
$file->move('uploads', $filename);
dd($file->getRealPath());
答案 4 :(得分:0)
移动图像后调整图像大小时出现此问题
$file->move('uploads', $fileName);
$file->getRealPath()
将返回false
。您需要在移动过程之前调整图像大小。那就是它;)
$img=Image::make('public/uploads/', $file->getRealPath())->resize(320, 240)->save('public/uploads/',$file->getClientOriginalName());
$file->move('uploads', $fileName);
答案 5 :(得分:0)
我刚刚解决了这个问题。
更改此行:
$file -> move('uploads', $fileName);
到
$file = $file -> move('uploads', $fileName);
现在$file->getRealPath()
具有有效值。
希望这对您有用。