3

イメージを s3 に保存し、s3 パスをデータベースに保存しています。画像を表示する必要があるときにパスを呼び出しています。そのため、現在、s3に保存する前にその画像のサイズを変更するのに問題があります。次のエラー メッセージが表示されます。

Command (getRealPath) is not available for driver (Gd).

これが私のコントローラーの外観です

public function up(Request $request) {

        $user = $request->user();
        $image= $request->file('images');

          if(!empty(($image))){
           $files = Input::file('images');
           foreach($files as $file) {
            if(!empty($file)){



            $ext = $file->getClientOriginalExtension();

            $media = ($user->media->where('category','profile')->first());
            if($media == null){
                $media = new Media();
                $media->category='profile';
            }       
                $this->saveMedia($media, $user,$file);
            }
        }
            return Redirect::back()->with('message','Your profile has been updated');
        }
    }
    private function saveMedia($media, $user, $file){

        $ext = $file->getClientOriginalExtension();
        $key = strtotime('now') . '.' . $ext;        
        $id = $user->id;
        $url = 'https://s3-us-west-2.amazonaws.com/makersbrand/' . $id . '/' . $media->category . '/';
        $media->user_id = $user->id;
        $media->path = $url . $key;

        $this->fillMedia($media,$user,$file, $key);
        $media->save();

    }
    private function fillMedia($media, $user, $file, $key)
    {
        $file = Image::make($file)->resize(200,200);
        $s3 = AWS::createClient('s3');
        $result = $s3->putObject(array(
            'Bucket' => self::$_BUCKET_NAME,
            'Key' => $user->id . '/'. $media->category .'/'. $key,
            'SourceFile' => $file->getRealPath(),
            'Metadata' => array(
            'Owner' => $user->first_name .' ' . $user->last_name
            )
            ));
    }

更新 getClientOriginalExtension エラーが発生する前に、画像のサイズが適切に変更されるとは思えません。サイズ変更後に var_dump を実行すると、次のテキストが表示されます。

object(Intervention\Image\Image)#238 (9) { ["driver":protected]=> 
object(Intervention\Image\Gd\Driver)#237 (2) { ["decoder"]=> 
object(Intervention\Image\Gd\Decoder)#241 (1) { 
["data":"Intervention\Image\AbstractDecoder":private]=> NULL } 
["encoder"]=> object(Intervention\Image\Gd\Encoder)#242 (4) { ["result"]=> 
NULL ["image"]=> NULL ["format"]=> NULL ["quality"]=> NULL } } 
["core":protected]=> resource(280) of type (gd) ["backups":protected]=> 
array(0) { } ["encoded"]=> string(0) "" ["mime"]=> string(10) "image/jpeg" 
["dirname"]=> string(26) "/Applications/MAMP/tmp/php" ["basename"]=> 
string(9) "phpVGzVk0" ["extension"]=> NULL ["filename"]=> string(9)
 "phpVGzVk0" }

結果はヌルです。フォーマットはヌルです。画像はヌルです。ここで何が間違っていますか?

更新 Image::make を saveMedia 関数に移動しました。今私は得る

Command (getRealPath) is not available for driver (Gd).
4

4 に答える 4

1

ここでの主なエラー - Intervention\Image\ImageFile の代わりに間違ったオブジェクト ( ) を渡しています。

あなたの場合、次のように動作するはずです:

private function fillMedia($media, $user, $file, $key)
{
    $image = Image::make($file)->resize(200,200);
    $s3 = AWS::createClient('s3');
    $result = $s3->putObject(array(
        'Bucket' => self::$_BUCKET_NAME,
        'Key' => $user->id . '/'. $media->category .'/'. $key,

        // use 'Body' option to put resized image content instead of 'SourceFile'
        // fyi, your resized image wasn't saved to the original file
        'Body' => $image->__toString(),
        'Metadata' => array(
            'Owner' => $user->first_name .' ' . $user->last_name
        )
    ));
}
于 2017-01-08T11:08:04.457 に答える