web-dev-qa-db-ja.com

Laravel 5.2-介入画像で読めない画像ソース

特定の画像のサイズ変更プロセスに関する小さな問題があります。入力タイプを含むフォームを送信しようとしています->ファイル<-サイズ変更せずに写真をアップロードできました。画像なので、以下を使用して介入画像ライブラリをインストールしました。

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
11
KaldoLeb

Image::make($file->getRealPath())の代わりにImage::make('public/uploads/', $file->getRealPath())であるべきではありませんか?

Image::make() は2つの引数をとらないようですので、問題になる可能性があります。

これを試して:

$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());
12
borfast

L5.2Inputファサードから画像を直接取得することはできません。そのためには、まずサーバーに画像を保存してから、Image facadeにパスを与えて画像の操作を行う必要があります。

コードは次のようになります:

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
Tarunn

保存する前にファイルをアップロードしてサイズを変更するのは簡単です:(検証やチェックなしで)

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.45である最新の5.2バージョンでテストされただけです

[編集:]

あなたが電話した場合

$file->move();

使用しないでください

$file->getRealPath() 

これは、move()を呼び出した後にfalseを返すためです

    $filename = $file->getClientOriginalName();
    $file->move('uploads', $filename);
    dd($file->getRealPath());
1
shock_gone_wild

この問題は、移動後に画像のサイズを変更したときに発生しました

$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);
0
Abdalla Arbab