今からスタート! PHP

第12回 ファイルのアップロード

この記事を読むのに必要な時間:およそ 3 分

ファイルでの保存

アップロードによって受信したデータをファイルとして保存してみましょう。まずリスト3に,アップロードされたデータをアップロードされたファイルと同じ名称でimgディレクトリに保存する例を示します。

リスト3 imgディレクトリに同じファイル名でデータを保存する例

// $file は データの一時ファイル名, $name は アップロードしたファイルの名称
$file  = $_FILES[ 'picture' ][ 'tmp_name' ];
$name  = $_FILES[ 'picture' ][ 'name' ];
// 正常にアップロードされていれば,imgディレクトリにデータを保存
if ( $_FILES[ 'picture' ][ 'error' ] == UPLOAD_ERR_OK &&
     is_uploaded_file( $file ) )
  move_uploaded_file( $file, 'img/' . $name );

アップロードが完了したら,まずエラーコードがUPLOAD_ERR_OKであるかを確認します。そしてis_uploaded_file関数によって,受信したデータがアップロードされたものであるかも確認します。この関数の戻り値は,ファイルがHTTPのPOSTメソッドによりアップロードされたものであればTRUEとなります。

データの確認が済んだら,move_uploaded_file関数で一時ファイルから保存用ディレクトリ(ここではimg)にファイルを移動し,データを保存します。ファイルで保存する場合は,保存用ディレクトリおよび保存したファイルのアクセス権限を適切に設定し,アクセス可能なアプリケーションが限定されるようにすべきでしょう。

データベースへの保存

アップロードにより受信したデータは,ファイルとしてだけではなく,データベースに保存することもあるでしょう。リスト4にPostgreSQLのテーブルに保存する例を示します。リスト5にテーブル定義を示します。ここではデータをラージオブジェクトとして保存するようにしています。

リスト4では,ラージオブジェクトを保存するために,SQLのINSERT文中でlo_importというPostgreSQLの関数を用いています。これはファイルにアクセスしてデータを読み込み,その内容をテーブルに保存する関数です。他のデータベースを用いる場合は,それぞれのラージオブジェクトの保存方法に従ってください。なお,データベースに保存する場合も,意図しないデータの漏洩を防ぐ対策を別途施しておくべきでしょう。

リスト4 PostgreSQLのpictureテーブルにデータを保存(例外処理,文字化け対策は省略)

$title = $_POST[ 'title' ];                    // 画像のタイトル
$type  = $_FILES[ 'picture' ][ 'type' ];       // MIMEタイプ
$file  = $_FILES[ 'picture' ][ 'tmp_name' ];   // 一時ファイル名

if ( $_FILES[ 'picture' ][ 'error' ] == UPLOAD_ERR_OK &&
     is_uploaded_file( $file ) )  {
  // データベース接続
  $db = new PDO( 'pgsql:host=localhost port=5432 dbname=postgres', 'postgres', 'password' );
  // トランザクション開始
  $db->beginTransaction();
  // SQL文実行準備
  $stmt = $db->prepare( 'INSERT INTO picture( title, type, data ) VALUES ( :title, :type, lo_import( :file ) )' );
  // SQL文実行
  $stmt->execute( array( ':title' => $title, ':type' => $type, ':file' => $file ) );
  // 実行完了(コミット)
  $db->commit();
  // データベース切断
  unset( $db );
}

リスト5 データを保存するテーブルの例(PostgreSQL用)

CREATE SEQUENCE picid;
CREATE TABLE picture (
  id    INTEGER PRIMARY KEY NOT NULL DEFAULT NEXTVAL( 'picid' ),
  title VARCHAR(200) NOT NULL UNIQUE,
  type  VARCHAR(30) NOT NULL,
  data  oid NOT NULL
);

これまで基本的なPHPプログラミングのトピックをさまざま紹介してきたこの連載ですが,今回で最後となりました。本稿が読者にとってPHPプログラミングに親しむきっかけになったとすれば,筆者としては望外の喜びです。それでは,いつかまたお会いしましょう。

著者プロフィール

沖林正紀(おきばやしまさのり)

SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。

著書