#S3に画像をアップロードする方法
LaravelでAWS S3へ画像をアップロードする
こちらの記事を参考にして無事S3に画像を保存できました
#S3の画像の削除
※先程の記事の一部を引用し、削除コードを書いていきます
参考記事のコード = PostsController.php
実装コード = exampleController.php
削除ボタンを押すと、このコントローラが走るようにルーティング
public function delete(Request $request) {
$image = $request->image_path;
$s3_delete = Storage::disk('s3')->delete($image);
$db_delete = Post::where('image',$image)->delete();
return redirect('hogehoge');
}
これでDBとS3から画像を削除!
とおもいきや、Dbからは削除されるのにS3からは削除できていない
S3から削除できない原因
$post->image_path = Storage::disk('s3')->url($path);
参考記事ではこのように、パスにURL関数を使いそれをDBに保存しているので、DBにはURLを含んだパスが保存されています。
S3はvi3kAwK0z0X19XU3LWcz63101t0rYilRHiWG9MmC.jpg
DBはhttps://example.s3-ap-northeast-1.amazonaws.com/myprefix/vi3kAwK0z0X19XU3LWcz63101t0rYilRHiWG9MmC.jpg
のように保存されているため、
exampleController.php
の$image
はこうなっています。
$image = https://example.s3-ap-northeast-1.amazonaws.com/myprefix/vi3kAwK0z0X19XU3LWcz63101t0rYilRHiWG9MmC.jpg;
なのでS3に「そんなものないよ!」と言われているので削除ができないということでした。
##解決策
参考記事をこのように変更します。
public function create(Request $request)
{
$post = new Post;
$form = $request->all();
//s3アップロード開始
$image = $request->file('image');
// バケットの`myprefix`フォルダへアップロード
$path = Storage::disk('s3')->putFile('myprefix', $image, 'public');
// アップロードした画像のフルパスを取得
+ $post->image_path = $path; //追加
- $post->image_path = Storage::disk('s3')->url($path); //削除
$post->save();
return redirect('posts/create');
}
こうすることで、S3とDBに保存される名前を一致できたのでexampleController.php
を内容は変更せず削除ができるようになりました。
#View
srcにhttps://example.s3-ap-northeast-1.amazonaws.com/
を追加すると表示することができました!
<img src="https://example.s3-ap-northeast-1.amazonaws.com/{{ $my_image['image'] }}" >