前提・実現したいこと
PHPで画像の表示させたい。
現在、PHPで画像アップロード処理を初めて勉強しています。
そこで簡易的に画像アップロードの機能を以下のように作りました。
※現在できているところをいかに書きます。
何もバリデーションに引っかからなければ、以下のように成功しましたのメッセージが表示されて、データベースにファイルパスが保存される。+imgディレクトリにも画像ファイルが保存される。
最後にvar_dumpでファイルパスが取得できるか確認すると、以下のように取得できていることは確認できる
発生している問題・エラーメッセージ
データベースに保存、ディレクトリに保存、var_dumpでデータの取得はできるところまではできているのですが、肝心の画像を表示させることができません。
img.php(画像投稿フォーム)
php
1<?php 2require_once(ROOT_PATH .'/Models/Post.php'); 3ini_set('display_errors', "On"); 4 5$obj = new Post(); 6$files = $obj->getFile(); 7foreach($files as $file) { 8 var_dump($file); 9} 10 11?> 12<!DOCTYPE html> 13<html lang="en"> 14<head> 15 <meta charset="UTF-8"> 16 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 17 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 18 <title>画像投稿練習</title> 19</head> 20<body> 21 <form action="img_upload.php" method="POST" enctype="multipart/form-data"> 22 <h1>画像の投稿</h1> 23 <div class="file-up"> 24 <input type="hidden" name="MAX_FILE_SIZE" value="1048576"> 25 <input type="file" name="img" accept="image/*"> 26 </div> 27 <input type="submit" name="upload" value="送信"> 28 </form> 29 <div class="file-index"> 30 <?php foreach($files as $file): ?> 31 <img src="<?php echo "{$file['file_path']}"; ?>" alt=""> 32 <?php endforeach; ?> 33 </div> 34</body> 35</html>
img_upload.php(フォーム送信先)
php
1<?php 2require_once(ROOT_PATH .'/Models/Post.php'); 3ini_set('display_errors', "On"); 4 5$file = $_FILES['img']; 6 7$filename = basename($file['name']); 8$tmp_path = $file['tmp_name']; 9$file_err = $file['error']; 10$filesize = $file['size']; 11$upload_dir = 'img/'; 12$save_filename = date('Ymdhis').$filename; 13$save_path = $upload_dir.$save_filename; 14 15// ファイルのバリデーション 16// ①ファイルがそもそもあるか 17if(is_uploaded_file($tmp_path)) { 18 if(move_uploaded_file($tmp_path, $save_path)) { 19 echo "ファイルをアップしました!"; 20 // DBに保存 21 $obj = new Post(); 22 $img_date = $obj->fileSave($save_path); 23 if($img_date) { 24 echo "データベースに保存しました"; 25 } else { 26 echo "データベースへの保存が失敗しました"; 27 } 28 } else { 29 echo "ファイルが保存できませんでした。"; 30 } 31} else { 32 echo "ファイルが選択されていません。"; 33} 34 35// ②拡張子は画像形式か 36$allow_ext = array('jpg', 'jpeg', 'png'); 37$file_ext = pathinfo($filename, PATHINFO_EXTENSION); 38 39if(!in_array(strtolower($file_ext), $allow_ext)) { 40 echo "画像ファイルを添付してください。"; 41} 42 43// ③ファイルのサイズが1MB未満か 44if($filesize > 1048576 || $file_err == 2) { 45 echo "ファイルのサイズは1MB未満にしてください。"; 46} 47 48?> 49 50<!DOCTYPE html> 51<html lang="en"> 52<head> 53 <meta charset="UTF-8"> 54 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 55 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 56 <title>Document</title> 57</head> 58<body> 59 <a href="img.php">戻る</a> 60</body> 61</html>
Post.php 画像投稿ロジック
php
1<?php 2require_once(ROOT_PATH .'/Models/Db.php'); 3ini_set('display_errors', "On"); 4 5class Post 6{ 7 /** 8 * ファイルデータの保存 9 * @param string $save_path 保存先のパス 10 * @param bool $return 11 */ 12 13 public function fileSave($save_path) { 14 $result = false; 15 16 try { 17 $sql = 'INSERT INTO img (file_path) VALUES (:file_path)'; 18 $stmt = connect()->prepare($sql); 19 $stmt->bindValue(':file_path', $save_path); 20 $result = $stmt->execute(); 21 return $result; 22 23 } catch(\Exception $e) { 24 echo "エラーが発生しました。". $e->getMessage(); 25 return $result; 26 } 27 } 28 29 /** 30 * ファイルデータの取得 31 * @param array $fileDate 32 */ 33 34 public function getFile() { 35 $sql = 'SELECT * FROM img'; 36 37 $fileDate = connect()->query($sql); 38 return $fileDate; 39 } 40}
データベース接続
<?php require_once(ROOT_PATH .'/env.php'); ini_set('display_errors', "On"); // 接続チェックOK function connect() { $host = DB_HOST; $db = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4"; try { $pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); return $pdo; } catch(PDOException $e) { echo "接続失敗です!". $e->getMessage(); exit(); } }
試したこと
img_upload.phpの絶対パスが違うのではないか?
$upload_dir = 'img/';
↓
$upload_dir = '/Applications/MAMP/htdocs/アプリ名/public/img/';
imgファイルはpublic配下にある。
MAMPのドキュメントルートは、Applications ▹ MAMP ▹ htdocs ▹ アプリ名 ▹ public
なので、絶対パスは
$upload_dir = 'img/';
で問題ないと思われる。
foreach($files as $file) { var_dump($file); }
の結果は、
array(2) { ["id"]=> string(2) "10" ["file_path"]=> string(29) "img/202104160402212448564.png" }
var_dump($files);の結果は、
object(PDOStatement)#3 (1) { ["queryString"]=> string(17) "SELECT * FROM img" }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/16 06:22
退会済みユーザー
2021/04/16 07:39