14

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

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

}
}

但不是调整图片大小,而是引发以下异常

NotReadableException in AbstractDecoder.php line 302:
Image source not readable
4

7 回答 7

14

不应该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());
于 2016-10-04T14:56:42.837 回答
3

因为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立面拍摄图像。如果你们中的任何人有直接的解决方案,请在此处显示您的代码,我将奖励您这笔赏金。干杯。

于 2016-10-10T14:46:16.243 回答
1

在保存之前上传文件并调整其大小就这么简单:(无需验证或检查)

您可以直接将 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());
于 2016-10-11T05:32:42.810 回答
1

移动后调整图像大小时出现此问题

$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);
于 2017-08-19T06:07:44.967 回答
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 辅助函数,就像带有注释的代码一样,你可能会因为表单字段可能有空白而遇到问题。

于 2020-01-31T12:04:03.153 回答
1

这对我来说很好

$file->move($location,$file_name);  
$img = Image::make($location.'/'.$file_name)->fit(100)->save(public_path('thumbnails'.'/'.$file_name),50);
于 2021-11-02T00:33:18.750 回答
0

我刚刚解决了这个问题。

改变这一行:

$file -> move('uploads', $fileName);

$file = $file -> move('uploads', $fileName);

现在 $file->getRealPath()有一个有效值。

希望这对你有用。

于 2020-05-09T19:26:33.510 回答