phpで、webで画像アップロードしてみる
画像をDB(mysql)に登録する方法が難しかったので、メモ
ファイルをアップロードしてアップロードした画像を表示するサンプル
DB準備
-- -- テーブルの構造 `img_data` -- CREATE TABLE `img_data` ( `id` int(11) NOT NULL AUTO_INCREMENT, `img_bin` blob NOT NULL, `mime` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=23 ;
サンプルソース
<?php // PDO接続 try{ $pdo = new PDO("mysql:host=localhost;dbname=Study","root","root", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'")); // POST送信だったらインサート処理 if ($_POST['send']) { // 画像ファイル名取得 $img_file_name = $_FILES['upfile']['name']; // 保存先URL $save_img_url = "./img/" .$img_file_name; // 画像ファイルを保存先URLにコピーできるかチェック if (!@move_uploaded_file($_FILES['upfile']['tmp_name'], $save_img_url)) { echo test; exit; } // 画像ファイルか識別する if (!exif_imagetype($save_img_url == false)) { $img_data = file_get_contents($save_img_url); $mime = "jpg"; // 登録 $stmt = $pdo -> prepare("INSERT INTO img_data (img_bin, mime) VALUES (?, ?)"); $stmt -> execute(array($img_data, $mime)); } } } catch(PDOException $e) { die($e -> getMessage()); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" /> </head> <body> <form enctype="multipart/form-data" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="600000" /> <input type="file" name="upfile"> <input type="submit" name="send" value="送信"> </form> <?php // 一覧取得 $stmt = $pdo -> query("SELECT * FROM img_data"); while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { echo "<img src=./create_image.php?id=" .$row['id'] . ">"; } ?> </body> </html>
・update_img.php
<?php $pdo = new PDO("mysql:host=localhost;dbname=Study","root","root", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'")); $stmt = $pdo -> query("SELECT * FROM img_data where id =" .$_GET['id']); while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { header( "Content-Type: image/jpeg"); echo $row['img_bin']; } ?>
注意事項
- formタグの中に、http-equiv="Content-Type" content="text/html" を指定する
- input typeで画像最大サイズの指定をしないといけない
- 登録までの処理の流れは以下
+ 画像ファイル名取得 = $_FILES['upfile']['name']
+ 画像ファイルをローカルパスから指定のURLにコピー = @move_uploaded_file($_FILES['upfile']['tmp_name'], $save_img_url)
※@は確かエラーになった場合強制的にスルーするだったはず。
+ 画像ファイルの識別 = if (!exif_imagetype($save_img_url == false))
※正しいサインが見つかった場合は適切な定数、それ以外の場合は FALSE を返します
- 画像表示する際は、imgタグのsrc要素にphpのファイルにGETパラメータでidを渡す
echo "<img src=./create_image.php?id=" .$row['id'] . ">";
- 表示する場所では、header関数にて画像のContent-Typeを指定する
header( "Content-Type: image/jpeg")
phpでPDO接続してみる
1.PDOとは何か…
以下のブログがとても丁寧に分かり易く書いてあります。
・http://kwsktr.hatenablog.com/entry/20110328/1301254129
どんなDBとの接続でもPDO接続を使えば同じ方法で接続できるというもので、
何処かのブログで、PDO接続は必須的な事を書いてあったので、メモ。
2.接続
try { $pdo = new PDO('mysql:host=localhost;dbname=bbs;charset=utf8','root','root', array(PDO::ATTR_EMULATE_PREPARES => false)); } catch (PDOException $e) { exit('データベース接続失敗。'.$e->getMessage()); }
3.取得
$sql = "SELECT imgdata FROM main where id = " . $_GET['id']; $stmt = $pdo -> query($sql); while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { echo $row['imgdata']; }
4.追加
$stmt = $pdo -> prepare("INSERT INTO main (name,title,message,password,imgdata) VALUES (?, ?, ?, ?, ?)"); $stmt -> execute(array($_POST['name'], $_POST['title'], $_POST['message'], $_POST['password'], $img_file));
AWS/EC2サーバーに入門してみた
webの勉強をする為に、AWS/EC2サーバーの無料利用枠を使う。
1、AWSのアカウント作成
アマゾン ウェブ サービス – Amazon Web Services
2、インスタンス作成
KeyPairと呼ばれるAWSのLinuxサーバーに接続する時に使う公開認証鍵(hogehoge.pem)
この.pemファイルを大事に保管しておくこと
セキュリティグループの設定 ➡ EC2のインスタンスに対して何番のポートを使うかを決める
∟22番ポート(ssh)、80番ポート(http)を指定
3、インスタンス接続
EC2 Management Consoleから作成しているインスタンスの一覧を見る事が可能。
ここのstateが「start」なら起動。「stop」なら停止。
選択した時に画面下に詳細が表示される ➡ PublicDNS:がグローバルアドレスとなる
※インスタンスを選択して右クリックから「Instance Lifecycle」からstateの変更が可能
※注意 「Terminate」を選択するとインスタンスが破棄されてしまうので気をつける
4、コンソールからログイン
ssh -i EC2key.pem ec2-user@ec2-54-213-100-22.us-west-2.compute.amazonaws.com
sshコマンドに-iオプションをつけ、公開鍵情報のファイル(hoge.pem)と、PublicDNSを指定する
※この時、hoge.pemファイルはhomeディレクトリ直下に置き、ファイルの権限を変更する
$ chmod 600 hoge.pem
5、Apachインストール
$ sudo yum install httpd インストール
$ sudo /etc/init.d/httpd start 起動
6、phpインストール
$ sudo yum install php php-mysql インストール
7、MySqlインストール
$ sudo yum install mysql-server インストール
$ sudo /etc/init.d/mysqld start 起動
8、Apacheの設定
設定ファイルを変更して公開ディレクトリを決める。 ➡ 「DoucumentRoot」部分
ここで設定したディレクトリに対象のファイルを置けば、見えるようになる。
$ sudo vi /etc/httpd/conf/httpd.conf
$ sudo /etc/init.d/httpd restart 再起動
・その他
■MySqlデータの移行
phpMyAdminのエクスポート機能にて、対象のデータベースを選択するだけで.sqlファイルを作ってくれる
この.sqlファイルをサーバー上に配置してコマンド実行する
$ mysql -u root -p databaseName (データベース名) < c:/insert.sql (.sqlファイルがあるディレクトリ)
※データベースのみ先に作成しておく
画面上のコンボボックスをSFTPに設定する
サーバー:PublicDNS ユーザ名:ec2-user(固定?) キーチェーンに追加するにチェック
詳細設定-公開鍵認証を使用するにチェック ➡ 対象の.pemファイルを指定
----------------------------------------------------------------------------------------------------------
■参考URL
・http://www.ita84.com/?p=74 全体の流れがここでわかる
・http://www.slideshare.net/ken インスタンスの作成について