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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

PHP

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

Amazon S3

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

Q&A

解決済

1回答

1285閲覧

S3を使用してユーザー別の投稿画像を表示したい

Jonh

総合スコア1

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

PHP

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

Amazon S3

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

0グッド

1クリップ

投稿2021/10/07 13:45

実現したいこと

PHPを使用し掲示板を作成しています。
ユーザー別にログインができるようになっており、投稿した画像をユーザーの投稿別に表示できるようにしたいです。

発生している問題・エラーメッセージ

herokuでデプロイしているため投稿した画像はAWS S3のバケットに保存をしているのですが、サイト上の投稿一覧画面では以下の写真のアイコンが2つ表示されAWS S3に投稿した画像が表示されない状況です。
(S3のバケット内では画像の保存の確認はできています。)
イメージ説明

試したこと

以下のようにlistObjectsを使用し画像一覧を取得しforeachに組み込むことで一覧が表示できるとかと思いましたが、そもそもデーターベースのユーザーテーブルとポストテーブルから取得しているユーザー名と投稿内容を既にforeachで表示している中にさらにS3からの画像をforeachでループできるのしょうか?

$objects = $s3Client->listObjects([ 'Bucket' => $bucket, ]);

該当のソースコード

<!-- Posts --> <?php use Aws\S3\S3Client; if(isset($_REQUEST['page'])){ $page = $_REQUEST['page']; }else{ $page == ''; $page = 1; } $page = max($page,1); $counts = $db->query('SELECT COUNT(*) AS cnt FROM posts'); $cnt = $counts->fetch(); $maxPage = ceil($cnt['cnt'] / 5); $page = min($page, $maxPage); $page_start = ($page - 1) * 5; $posts = $db->prepare('SELECT u.user_name, p.* FROM users u, posts p WHERE u.user_id=p.post_user_id ORDER BY p.post_date DESC LIMIT ?,5'); $posts->bindParam(1, $page_start, PDO::PARAM_INT); $posts->execute(); $bucket = '****'; $key = '****'; $secret = '****'; $s3Client = new Aws\S3\S3Client([ 'region' => 'ap-northeast-1', 'version' => '2006-03-01', 'credentials' => [ 'key' => $key, 'secret' => $secret, ] ]); $objects = $s3Client->listObjects([ 'Bucket' => $bucket, ]); ?> <!-- Post preview--> <?php foreach ($posts as $post): ?> <div class="post-preview"> <a href="post.php?post_id=<?php echo htmlspecialchars($post['post_id']); ?>"><?php echo htmlspecialchars($post['post_contents']); ?></a> <p class="postContents"><?php echo htmlspecialchars($post['post_date'], ENT_QUOTES); ?> | <?php echo htmlspecialchars($post['user_name'], ENT_QUOTES); ?></p> <?php foreach ((array)$objects as $object): ?> <img width="300" src="https://s3-ap-northeast-1.amazonaws.com/<?php echo $bucket ?>/<?php echo $object['Key'] ?>" /><br /> <?php endforeach; ?> <hr class="my-4" /> </div> <?php endforeach; ?>

どなたか知見のある方ご教示いただけると幸いです。

どうぞ宜しくお願い致します。

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

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

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

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

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

AbeTakashi

2021/10/07 17:25

WEBブラウザ上のHTMLのソースコードはどのようになっているのでしょうか? ちゃんと画像のURLが正しく表示されているのでしょうか? その画像のURLを直接WEBブラウザでアクセスしたら画像はきちんと表示されるのでしょうか? きちんと表示されない場合はhttpレスポンスコードはどのようになっているのでしょうか?(404とか503とか) 画像のアイコンが二つ出ているのはforeachで意図している挙動なのでしょうか? $s3Client->listObjectsで返ってくるデータ($objects)の中がどのようになっているかvar_dump()などで調べたでしょうか? 調べられることはたくさんある気もしますし、これらをすべて調べているのであれば、質問文に含むべき内容だと思いますので、一部を伏せ字にするなどして質問文に追記してください。
guest

回答1

0

自己解決

再度コードを確認し、リファレンスなどを確認した上で以下の方法で解決ができました!

use

1 2$s3Client = new Aws\S3\S3Client([ 3 'region' => '*********', 4 'version' => '2006-03-01', 5 'credentials' => [ 6 'key' => "***********", 7 'secret' => "*********", 8 ] 9]); 10 11 12if(isset($_REQUEST['page'])){ 13$page = $_REQUEST['page']; 14}else{ 15 $page == ''; 16 $page = 1; 17} 18$page = max($page,1); 19 20$counts = $db->query('SELECT COUNT(*) AS cnt FROM posts'); 21$cnt = $counts->fetch(); 22$maxPage = ceil($cnt['cnt'] / 5); 23$page = min($page, $maxPage); 24 25$page_start = ($page - 1) * 5; 26 27$posts = $db->prepare('SELECT u.user_name, p.* FROM users u, posts p WHERE u.user_id=p.post_user_id ORDER BY p.post_date DESC LIMIT ?,5'); 28$posts->bindParam(1, $page_start, PDO::PARAM_INT); 29$posts->execute(); 30$rows = $posts->fetchAll(); 31?> 32 33<!-- Main Content --> 34<div class="container px-4 px-lg-5 "> 35 <div class="row gx-4 gx-lg-5 justify-content-center"> 36 <div class="col-md-10 col-lg-8 col-xl-7"> 37 38 39<?php foreach ($rows as $post) : ?> 40<?php 41 $cmd = $s3Client->getCommand('GetObject', [ 42 'Bucket' => '*********', 43 'Key' => $post["post_image"], 44 ]); 45 $request = $s3Client->createPresignedRequest($cmd, '+10080 minutes'); 46 $presignedUrl = (string)$request->getUri(); 47?> 48<div class="post-preview"> 49 <a href="post.php?post_id=<?php echo htmlspecialchars($post['post_id']); ?>"><?php echo htmlspecialchars($post['post_contents']); ?></a> 50 <p><img width="300" src="<?php echo $presignedUrl ?>"></p> 51 <p class="postContents"><?php echo htmlspecialchars($post['post_date'], ENT_QUOTES); ?> | <?php echo htmlspecialchars($post['user_name'], ENT_QUOTES); ?></p> 52 <hr class="my-4" /> 53</div> 54<?php endforeach; ?> 55 56 <?php if($page > 1): ?> 57 <a href="index.php?page=<?php echo $page-1; ?>">Back |</a> 58 <?php else: ?> 59 <a>Back |</a> 60 <?php endif; ?> 61 62 <?php if($page < $maxPage ): ?> 63 | <a href="index.php?page=<?php echo $page+1; ?>">Next</a> 64 <?php else: ?> 65 <a>Next</a> 66 <?php endif; ?> 67 </div> 68 </div> 69</div> 70

投稿2021/10/15 05:38

Jonh

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問