前提・実現したいこと
画像をパスとしてDBに入れたいのですが、ファイル選択後アップしようとしたらエラーとなります。
解決方法分かる方いらっしゃいましたらよろしくお願いします。
発生している問題・エラーメッセージ
Warning: move_uploaded_file(test/256b353c880efec6233f5cb3cebea7416ca19b19.jpg): failed to open stream: No such file or directory in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/test/index.php on line 66 Warning: move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phpWFkIdu' to 'test/256b353c880efec6233f5cb3cebea7416ca19b19.jpg' in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/test/index.php on line 66
common.php
<?php /** * common.php */ /** * connect_db * @return \PDO */ function connect_db() { $dsn = 'mysql:host=localhost;dbname=mblog;charset=utf8'; $username = 'root'; $password = ''; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]; return new PDO($dsn, $username, $password, $options); } /** * insert * @param string $sql * @param array $arr * @return int lastInsertId */ function insert($sql, $arr = []) { $pdo = connect_db(); $stmt = $pdo->prepare($sql); $stmt->execute($arr); return $pdo->lastInsertId(); } /** * select * @param string $sql * @param array $arr * @return array $rows */ function select($sql, $arr = []) { $pdo = connect_db(); $stmt = $pdo->prepare($sql); $stmt->execute($arr); return $stmt->fetchAll(); } /** * htmlspecialchars * @param string $string * @return $string */ function h($string) { return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); }
index.php
<?php /** * index.php */ /** * 共通関数読み込み */ require 'common.php'; /** * file_upload */ function file_upload() { // POSTではないとき何もしない if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') { return; } // タイトル $title = filter_input(INPUT_POST, 'title'); if ('' === $title) { throw new Exception('タイトルは入力必須です。'); } // アップロードファイル $test = $_FILES['test']; /** * @see http://php.net/manual/ja/features.file-upload.post-method.php */ if ($test['error'] > 0) { throw new Exception('ファイルアップロードに失敗しました。'); } $tmp_name = $test['tmp_name']; // ファイルタイプチェック $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimetype = finfo_file($finfo, $tmp_name); // 許可するMIMETYPE $allowed_types = [ 'jpg' => 'image/jpeg' , 'png' => 'image/png' , 'gif' => 'image/gif' ]; if (!in_array($mimetype, $allowed_types)) { throw new Exception('許可されていないファイルタイプです。'); } // ファイル名(ハッシュ値でファイル名を決定するため、同一ファイルは同盟で上書きされる) $filename = sha1_file($tmp_name); // 拡張子 $ext = array_search($mimetype, $allowed_types); // 保存作ファイルパス $destination = sprintf('%s/%s.%s' , 'test' , $filename , $ext ); // アップロードディレクトリに移動 if (!move_uploaded_file($tmp_name, $destination)) { //on line 66 throw new Exception('ファイルの保存に失敗しました。'); } // Exif 情報の削除 $imagick = new Imagick($destination); $imagick->stripimage(); $imagick->writeimage($destination); // データベースに登録 $sql = 'INSERT INTO `images` (`id`, `title`, `path`) VALUES (NULL, :title, :path) '; $arr = []; $arr[':title'] = $title; $arr[':path'] = $destination; $lastInsertId = insert($sql, $arr); // 成功時にページを移動する header(sprintf('Location: image.php?id=%d', $lastInsertId)); } try { // ファイルアップロード file_upload(); } catch (Exception $e) { $error = $e->getMessage(); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .error { color: red; } </style> </head> <body> <div id="wrap"> <?php if (isset($error)) : ?> <p class="error"><?= h($error); ?></p> <?php endif; ?> <form action="" method="post" enctype="multipart/form-data"> <p> <label for="title">タイトル</label> <input type="text" name="title" id="title" /> </p> <p> <label for="test">画像ファイル</label> <input type="file" name="test" id="test" /> </p> <p> <button type="submit">送信</button> </p> </form> </div> </body> </html>
image.php
<?php /** * image.php */ require 'common.php'; try { $id = filter_input(INPUT_GET, 'id'); // データベースからレコードを取得 $sql = 'SELECT `id`, `title`, `path` FROM `images` WHERE `id` = :id'; $arr = []; $arr[':id'] = $id; $rows = select($sql, $arr); $row = reset($rows); } catch (Exception $e) { $error = $e->getMessage(); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .error { color: red; } </style> </head> <body> <div id="wrap"> <?php if (isset($error)) : ?> <p class="error"><?= h($error); ?></p> <?php endif; ?> <p><?= h($row['title']); ?></p> <p> <img src="<?= h($row['path']); ?>" alt="<?= h($row['title']); ?>" /> </p> </div> </body> </html>
###testのパーミッション
drwxrwxrwx 5 neko admin 160 1 6 19:26 test
###作成したテーブル
CREATE TABLE `images` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(32) DEFAULT NULL, `path` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
###ディレクトリ構造
test ┣ common.php ┣ image.php ┗ index.php
試したこと
testのパーミッションが755だったので一応777にしてみました。
補足情報(FW/ツールのバージョンなど)
エラーのon line 66の部分はindex.phpに記載しておきました。
参考にしたサイト
OS:mac
mysql:5.6
php:7.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/06 21:34
2020/01/06 21:39
2020/01/06 23:38
2020/01/07 00:04
2020/01/07 03:21 編集
2020/01/07 03:48
2020/01/07 03:50
2020/01/07 08:37
2020/01/07 10:42
2020/01/07 13:46