質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4117閲覧

laravelでs3に保存されている画像を表示したい

togarashi

総合スコア1

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2023/01/09 06:02

前提

Laravelで画像を投稿できるSNSを作成しています
s3に画像を保存することは出来たのですが、s3のオブジェクトURLにアクセスすると以下のようなエラーが出てしまいます。

実現したいこと```

エラーメッセージ

This XML file does not appear to have any style information associated with it. The document tree is shown below. <Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>9XGJYD3JYABJJGQE</RequestId> <HostId>MqMLxVj+pfjhQl9Rx3UcKNZi7TUsn9Hhi75sWFpd7uu7trtHAFCMLt/bqnkNdOvV02PSQQ039ac=</HostId> </Error>

コード

  • index.blade.phpのimgタグのsrc属性にs3のオブジェクトURLを挿入して表示させたい

index.blade.php

1<img src="{{ Storage::disk('s3')->url('dir/'.$review->imgpath)}}">

試したこと

S3設定の問題かと思い**ブロックパブリックアクセス (バケット設定)**の項目は全てOFFにしてみましたが同じエラーページに飛ばされます。

コントローラで保存する段階で引数にpublicを指定することで、URLによるアクセスが可能になるというのを見かけたので実践してみましたがs3に画像が保存できなくなってしまいます。

PHP

1if ($request['imgpath']) { 2 3 //現在時刻を取得 4 $now = date_format(Carbon::now(), 'YmdHis'); 5 $file = $request->file('imgpath'); 6 //オリジナルネームを取得 7 $name = $file->getClientOriginalName(); 8 9 //ファイル名を現在時刻+オリジナルネームに変更 10 $tmpFile = $now . '_' . $name; 11 $tmpPath = $tmpFile; 12 13 //アスペクト比を維持して、画像サイズを横幅1080px、縦幅720pxにして一時保存する。 14 $image = InterventionImage::make($file) 15 ->fit(1080, 720, function ($constraint) { 16 $constraint->aspectRatio(); 17 })->save(storage_path('app/public/' .$tmpPath ) ); 18 19 // s3に画像ファイルとして保存 20 $s3 = Storage::disk('s3')->putFileAs('dir',new File(storage_path('app/public/' .$tmpPath )),$tmpPath, 'public'); 21 // $result = Storage::disk('s3')->url($s3); 22 // ddd($result); 23 24 // 一時ファイルを削除 25 $delete = Storage::disk('public')->delete($tmpPath); 26 }

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

S3から直接ファイルを公開するにはブロックパブリックアクセス (バケット設定)だけでなくバケットポリシーの設定も必要。

json

1{ 2 "Version": "2012-10-17", 3 "Statement": [ 4 { 5 "Sid": "PublicRead", 6 "Effect": "Allow", 7 "Principal": "*", 8 "Action": [ 9 "s3:GetObject", 10 "s3:GetObjectVersion" 11 ], 12 "Resource": [ 13 "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" 14 ] 15 } 16 ] 17}

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-2

ただS3の場合無制限に直接表示可能にするのはあまり推奨されてない。
Laravelなら一時的なURLを使えばS3側のパブリックアクセスは禁止したまま指定の時間だけ表示可能にできる。
用途次第だけど一番妥当な使い方。

php

1<img src="{{ Storage::disk('s3')->temporaryUrl('dir/'.$review->imgpath, now()->addDay()) }}">

他にはLaravelのコントローラーから画像自体を返す手もある。これでもS3のパブリックアクセスは不要。Laravel内で画像を取得してるから。
Laravel側の認証・認可で画像に対してアクセス制限したいような時はこの方法を使う。

投稿2023/01/09 06:46

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

togarashi

2023/01/09 06:49

jsonファイルを変更したら出来ました! なるほど、あまり推奨されていないんですね。ご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問