web-dev-qa-db-ja.com

Laravel 5.4ストレージ

ストレージファサードを使用して、正常に機能するアバターを格納していますが、以前のバージョンのlaravelで行ったように、イメージのサイズを変更したいです。どうすればこれを行うことができますか?ここに私がこれまで持っているものがあります(動作しません)

  $path   = $request->file('createcommunityavatar');
  $resize = Image::make($path)->fit(300);
  $store  = Storage::putFile('public/image', $resize);
  $url    = Storage::url($store);

エラーメッセージ:

  Command (hashName) is not available for driver (Gd).
20
wizardzeb

PutFileに間違ったオブジェクトを渡そうとしています。このメソッドは、(画像ではなく)Fileオブジェクトを想定しています。

$path   = $request->file('createcommunityavatar');

// returns \Intervention\Image\Image - OK
$resize = Image::make($path)->fit(300);

// expects 2nd arg - \Illuminate\Http\UploadedFile - ERROR, because Image does not have hashName method
$store  = Storage::putFile('public/image', $resize);

$url    = Storage::url($store);

では、主な理由を理解したら、コードを修正しましょう

// returns Intervention\Image\Image
$resize = Image::make($path)->fit(300)->encode('jpg');

// calculate md5 hash of encoded image
$hash = md5($resize->__toString());

// use hash as a name
$path = "images/{$hash}.jpg";

// save it locally to ~/public/images/{$hash}.jpg
$resize->save(public_path($path));

// $url = "/images/{$hash}.jpg"
$url = "/" . $path;

Storageファサードを使用することを想像してみましょう。

// does not work - Storage::putFile('public/image', $resize);

// Storage::put($path, $contents, $visibility = null)
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString());
21
Leonid Shumakov

putメソッドは、イメージ介入出力で機能します。 putFileメソッドは、Illuminate\Http\FileまたはIlluminate\Http\UploadedFileインスタンスを受け入れます。

$photo = Image::make($request->file('photo'))
  ->resize(400, null, function ($constraint) { $constraint->aspectRatio(); } )
  ->encode('jpg',80);

Storage::disk('public')->put( 'photo.jpg', $photo);

上記のコードは、アスペクト比を保持しながら、アップロードされたファイルのサイズを400ピクセル幅に変更します。次に、80%の品質でjpgにエンコードします。その後、ファイルは公開ディスクに保存されます。ディレクトリだけでなく、ファイル名を指定する必要があることに注意してください。

4
Jeffrey

私はこのようにします:

  1. 画像をサイズ変更して、どこかに(パブリックフォルダーなどに)保存します。
  2. 新しいファイルを作成し、Laravel=ファイルシステム関数(putFileAsなど)に渡します。
  3. 一時的な介入ファイルを削除

注:もちろん、必要に応じて変更できます。

$file = $request->file('portfolio_thumb_image');

$image = Image::make($file);

$image->resize(570, 326, function ($constraint) {
    $constraint->aspectRatio();
});

$thumbnail_image_name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME).'.'.$file->getClientOriginalExtension();

$image->save(public_path('images/'.$thumbnail_image_name));

$saved_image_uri = $image->dirname.'/'.$image->basename;

//Now use laravel filesystem.
$uploaded_thumbnail_image = Storage::putFileAs('public/thumbnails/'.$portfolio_returned->id, new File($saved_image_uri), $thumbnail_image_name);

//Now delete temporary intervention image as we have moved it to Storage folder with Laravel filesystem.
$image->destroy();
unlink($saved_image_uri);
3

Laravel= 5.8を使用

これが保存およびロードImageであるときに、Storageで画像ファイルを読み取りしようとすると、同様の問題が発生しました。
すべての答えに加えて、なぜそれが機能しなかったのか分かりませんでした。


Imageがファイルを読み取ろうとしたときの例外

Intervention\Image\Exception\NotReadableException:指定されたバイナリデータから初期化できません。

短い答え

->encode()を追加すると問題が解決しました

http://image.intervention.io/api/encode

シナリオ

基本的に私はこのようなテストをしました

_Storage::fake();

$photo = factory(Photo::class)->create();    
$file = \Image::make(
    UploadedFile::fake()->image($photo->file_name, 300, 300)
);

Storage::disk($photo->disk)
    ->put(
        $photo->fullPath(),
        $file
    );
_

そして、コントローラーにはこのようなものがありました

_return \Image::make(
    Storage::disk($photo->disk)
        ->get(
            $photo->fullPath()
        )
)->response();
_

溶液

調査後、Imageで作成されStorageで保存されたファイルのサイズは0オクテットであることがわかりました。この投稿とその数時間後のすべての解決策を見て、誰もがencode()を使用していることに気付きましたが、それについて誰も言及していませんでした。だから私は試してみたが、うまくいった。

もう少し調査すると、Imageは実際に、保存する前にフードの下でエンコードを行います。 https://github.com/Intervention/image/blob/master/src/Intervention/Image/Image.php#L146

だから、私の解決策はこれを簡単に行うことでした

_$file = \Image::make(
    \Illuminate\Http\UploadedFile::fake()->image('filename.jpg', 300, 300)
)->encode();

\Storage::put('photos/test.jpg', $file);
_

Tinkerでテスト可能、黒いイメージを作成します

3
cbaconnier

私は次の方法でそれをやった、そのシンプルでパスの混乱なし:

//Get file
$path= $request->file('createcommunityavatar');

// Resize and encode to required type
$img = Image::make($file)->fit(300)->encode('jpg');

//Provide own name
$name = time() . '.jpg';

//Put file with own name
Storage::put($name, $img);

//Move file to your location 
Storage::move($name, 'public/image/' . $name);
2
Govind Samrow

これを機能させるには、ファイルの先頭にuse Illuminate\Http\File;を追加し、ドキュメントセクション Automatic Streaming を必ず読んでください。

これは、すべてのjpegが必要であることを前提としています

$path   = $request->file('createcommunityavatar');
$resize = Image::make($path)->fit(300)->encode('jpg');
$filePath = $resize->getRealPath() . '.jpg';
$resize->save($filePath);
$store  = Storage::putFile('public/image', new File($resize));
$url    = Storage::url($store);

これは、ヘルプにコメントを付けてアプリケーションで行う方法です

// Get the file from the request
$requestImage = request()->file('image');

// Get the filepath of the request file (.tmp) and append .jpg
$requestImagePath = $requestImage->getRealPath() . '.jpg';

// Modify the image using intervention
$interventionImage = Image::make($requestImage)->resize(125, 125)->encode('jpg');

// Save the intervention image over the request image
$interventionImage->save($requestImagePath);

// Send the image to file storage
$url = Storage::putFileAs('photos', new File($requestImagePath), 'thumbnail.jpg');

return response()->json(['url' => $url]);
1
Rob

ネイティブStorageファサードを使用して見つけた最もクリーンなソリューションは次のとおりです。これは、Laravel 5.7、intervention/imageバージョン2.4.2。

$file = $request->file('avatar');
$path = $file->hashName('public/avatars');
$image = Image::make($file)->fit(300);
Storage::put($path, (string) $image->encode());

$url = Storage::url($path);

Laravel 5ファイルシステムで\ Intervention\Image\Imageオブジェクトを直接保存することはできません。できることは、リクエストから画像のサイズを変更し、同じtmpパスで保存することです。次に、アップロードされた(上書きされた)ファイルをファイルシステムに保存します。

コード:

$image  = $request->file('createcommunityavatar');
//resize and save under same tmp path
$resize = Image::make($image)->fit(300)->save();
// store in the filesystem with a generated filename
$store  = $image->store('image', 'public');
// get url from storage
$url    = Storage::url($store);
0
Jones03

現在のphpバージョンのGd拡張機能を更新してください。

それでも解決しない場合は、サイズ変更したイメージをローカルディスクに保存し、Storage :: putFileを使用してみてください。

ファイルがストレージパスにアップロードされたら、ファイルを削除できます。

PutFileメソッドの2番目のパラメーターは、Image Interventionクラスのインスタンスです。これを2番目のパラメーターとしてputFileメソッドに渡す必要があります。

$resize->save($absolutePath . 'small/' . $imageName);
0
Himanshu Sharma