Laravel 5.2中无法读取的图像源 - 干预图像

时间:2016-08-12 17:55:03

标签: php laravel-5.2 intervention

关于给定图片的大小调整过程,我遇到一个小问题,我正在尝试提交一个包含输入类型的表单 - >文件< - 我可以上传图片而不调整大小,之后我决定调整该图像的大小,因此我使用以下方法安装了干预图像库:

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

6 个答案:

答案 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()具有有效值。

希望这对您有用。