大きく初級向けと書いていますが、自分の備忘録も含めてです。。。。
初心者全員とは違うと思いますが、PHPを触り始めた当初、画像ファイルなどを扱うとき画像ファイルはサーバにあるディレクトリに保存しその保存したディレクトリパスをMySQLなどのDBで管理をするコードを書いてました。今思えばダサいコードでした。。。
当時はこのやり方に一つの疑問を持たず、またこれ以外のやり方を知らなかったということもあります。(PHPより先にhtmlやCSSなどを扱ってたこともあり、サーバのディレクトリに画像ファイルを置くことになんの抵抗もなかったことも起因します)
しかし、いくつか案件に参画し、このやり方よりもっと効率がいい管理の仕方があるのでは?と感じ始めました。
特に登録、参照だけでなく更新や削除が入ってきてディレクトリの権限などを考慮しなくてはならなくなったときに煩わしさを感じたことでさらに違和感が増してきました。
そこで画像などのファイルをバイナリで扱えば登録できないかと検索をするとビンゴ!いとも簡単に情報を探すことができました。。。。(セキュリティのことやOSやブラウザを横断的に対応。などを考えるとこっちのほうが断然いいと思ってます。。。現状は。)
そこで己の備忘録を踏まえロジックを書いていきたいと思います。
ファイルのアップロードは$_FILES[]!!
画面からファイルをアップロードする処理は単純です。
HTMLにファイルアップロード用のタグを用意してPHP側へsubmitを行い、PHPで取得する。それだけ!
コードは簡単にこのような感じです。
※最低限な箇所しか記載していません。***の部分など整合性が取れるように補足する必要があります。
[HTML側]
<form name="***" method="post" action="***.php" enctype="multipart/form-data">
<input type="file" name="***">
<input type="submit">
</form>
[PHP側]
$_var = $_FILES["***"];
これでまずは画面からアップロードされたファイルの情報を取ることができます。
$_FILESは二次元配列となっており、各箱にそれぞれ下記のような情報が入っています。
$_FILES["***"]["name"]
⇒アップロードされたファイルのファイル名
$_FILES["***"]["tmp_name"]
⇒アップロードしたファイルがサーバ上で一時的に保存されるテンポラリファイルの名前
$_FILES["***"]["type"]
⇒MIME型(PHP側ではチェックされていないため信用ないらしい)
$_FILES["***"]["size"]
⇒バイト単位でのファイルサイズ
$_FILES["***"]["error"]
⇒アップロードに関するエラーコード
MySQLではどういった型で取り扱うのか。
アップロードしたファイルをバイナリ型に押し込む際に、押し込み先のMySQLではどのようなカラムを用意すればよいのかということで、型以外は他の絡むと一緒で大丈夫ですが型についてはBLOB型を使います。中でも私はMEDIUMBLOB型を使っています。違いは取り扱うデータ容量で利用シーンによって使い分ければよいかと思います。
そしてPHPで取得した値をMySQLに登録します。
DB接続の部分などは省きますが、どのフレームワークを使っても処理に変わりはありません。重要なのはINSERTする際のVALUES。ここの設定になります。
$_FILES["***"]で取得している値をどのようにバイナリに変換するかというと
file_get_contents($_FILES["***"]["tmp_name"])
という関数を使い値を取り出してVALUESに設定します。なのでSQL文を簡単に書くと
INSERT INTO テーブル名 (対象のカラム名) VALUES(file_get_contents($_FILES["***"]["tmp_name"]))
となります。(本当ざっくりです)
ということでこれでアップロードした画像ファイルをバイナリとして扱い、MySQLに登録することができました。
じゃ登録した画像を画面で見るにはどうすればいいの??
登録したら次はその画像ファイルの参照方法です。
まずはSELECTを行い、そのカラムの値を取ってきます。
そして!
echo header("Content-Type: image/jpg");
echo {取得したカラムの値}
これで参照できるはずです。
ちなみにこの処理は他の処理と混合させず、この処理のみでクラスを作成することをお勧めします。
MVC的にはController、もしくはModelを一つ独立させ、View連携を解除させて呼び出す。ということになります。
コードの部分は抜粋しすぎて全然初心者向けではありませんが、備忘録ということにすり替えて。。。
近い将来、自分用にプラグイン化にできたらGithubなどで公開したいです。
0 件のコメント :
コメントを投稿