【PHP】画像ファイルのアップロードから削除までの流れ

php

ここまでPHPでファイルのアップロードやフォルダ内のファイル一覧表示などを記事を書いてきましたが、その処理を利用して画像ファイルのアップロードと削除の方法を記事にしようかと思います。

PHPでは画像をアップロードとか削除は割と頻繁にある処理だと思います。

画像ファイルのアップロードと削除のプログラムの全体像

今回、記事にするにあたってサンプルを作成しました。

メインとなるPHPで画像をアップロードと削除するプログラムを載せます。ただしファイルが選択されていない場合、チェックボックスにチェックが入っていない場合の「選択されていません」というような文言やリロード対策などの処理などは省いています。


PHPで画像ファイルのアップロードの処理

画像をアップロードする流れ

全体の流れは割りと基本的な事ですが、下記のような流れにしてみたいと思います。

  1. 画像ファイル名が日本語かどうか調べ、日本語の場合はエラー表示する
  2. 画像ファイルの拡張子を調べjpg/gif/pngのみアップロードできるようにチェックする
  3. 画像ファイルを保存するディレクトリーを調べて同じファイル名の画像がないかチェックする
  4. 上記で問題なければ指定した画像フォルダにアップロードをしてアップロードした画像を一覧表示します。

ディレクトリーと正規表現の変数

まずは、この画像アップロードと削除では画像を保存するディレクトリーを指定する必要があるのと、日本語かどうかチェックするための正規表現も必要になるので最初に宣言しておきます。


//画像を保存するディレクトリー
$dir="image/";
//日本語を省くための正規表現
$pattern="/^[a-z0-9A-Z\-_]+\.[a-zA-Z]{3}$/";

正規表現については説明すると長くなるので簡単に説明すると、アップロードの画像の名前が英数字と-(ハイフン)_(アンダーバー)かどうか.(ドット)以下の拡張子はアルファベットの大文字小文字が3文字かどうかチェックしています。jpg/gif/png の文字数が3文字だからです。

$_FILESでファイルを取得する

ファイルは「multipart/form-data」形式でエンコードされたPOSTメソッドにより、アップロードされます。アップロードされたファイルは$_POSTではなくスーパーグローバール変数の$_FILESへ格納されます。
ファイルの情報は$_FILESの連想配列に格納されてるのでそこから情報を取得する事ができる。


//アップロードされたファイルを取得
$upfile=$_FILES["image"]["name"];

/*==================================
 各情報にアクセスするには連想配列で取得する
===================================*/

$_FILES['指定name']['name']      // ファイル名
$_FILES['指定name']['type']      // ファイルのMIMEタイプ
$_FILES['指定name']['tmp_name']  //一時保存ファイル名
$_FILES['指定name']['error']     //アップロード時のエラーコード
$_FILES['指定name']['size']      //ファイルサイズ(バイト単位)


エラーチェックを行う処理

アップロードしたらそれが画像ファイルかどうかなどチェックしていきます。方法としてはもしエラーがあった場合は変数$erを連想配列としてエラーの文言を入れていきます。これは画像をアップロードする際にエラーがないかどうかの判断材料になります。

ファイル名に日本語が含まれているかチェックする

画像ファイルに日本語が含めれているかチェックするためにpreg_match()で英数字と-(ハイフン)_(アンダーバー)以外が文字列に含まれていた場合は、変数$erに連想配列でエラーの文言を格納します。


//ファイル名に日本語が入ってるかチェック
if(!preg_match($pattern,$upfile)){
     $er["jp"]="日本語はダメ";
  }

アップロードされたファイルが画像ファイルかどうかチェックする

画像ファイルかどうかを調べるには、アップされたファイルの拡張子を調べれば分かるので、substr()でファイル名の後ろから3文字を切り出してその文字列をif()でチェックします。


//アップされた画像の拡張子を抜き出す
$ext=substr($upfile,-3);
		
//拡張子を調べる
if($ext!="jpg" && $ext!="gif" && $ext!="png"){
    $er["image"]="拡張子がjpgとgifとpngのみアップできます";
}

同じ画像ファイルがアップされているか調べる

アップした画像ファイルがサーバーに存在していた場合はアップをしないようにしたいので、まずscandir()でディレクトリー内のファイルをすべて配列で取得します。

その後は、foreach()でファイル毎にループ処理をしますが、scandir()はディレクトリーも取得してしまいます。今回は画像ファイルしかアップしませんが、is_dir()で「ディレクトリー以外のファイルの場合」という条件分岐をしておきます。それによってファイルのみをチェックします。
後は、アップロードされた画像ファイル名とディレクトリーから取得したファイル名が一致すればすでに同じファイル名が存在しているという判断になります。


//ファイル重複チェックするためにディレクトリー内のファイルを取得する
$filelist=scandir($dir);
        
foreach($filelist as $file){
         
	//is_dir関数でディレクトリー以外のファイル(つまり画像のみ)を調べる
	if(!is_dir($file)){
        if($upfile==$file){
            $er["double"]="重複してるのでアップできません。";
        }
    }
}


エラーがなければ画像ファイルをアップロードする

上記のエラーの処理をしてエラーがあった場合は変数$erに各エラーの文言を格納していますので、ですの$erが空であればエラーがないと判断できるので、move_uploaded_file()で指定したディレクトリに画像ファイルをアップロードします。

注意点として、アップロードされたファイルはテンポラリファイルとして$_FILE[パラメータ名][tmp_name]に一時的に格納されます。ですので実際にサーバーにアップするには、テンポラリファイルをmove_uploaded_file()関数に指定してディレクトリーにコピーする必要があります。
テンポラリファイルはPHPの処理の終了後に自動的に削除されます。


//エラーの配列をチェックして空だった場合・・つまりエラーがなければ画像をアップロードする
if(empty ($er)){
    move_uploaded_file($_FILES["image"]["tmp_name"],$dir.$upfile);
}
	

画像ファイルをサーバーにアップロードする内容はここまでです。

PHPでサーバーから画像ファイルを削除する処理

アップロードが完了したら今度は削除する方法を記載していきます。サーバーから画像ファイルを削除する流れは下記のようにします。

  1. チェックを入れた画像の名前を$_POSTで受けとる。複数の場合もあるので配列で処理するのでフォームのname属性は配列を指定しておく
  2. file_exists()でファイルがサーバーに存在するかif()で判定する
  3. unlink()で画像をサーバーから削除する

サーバーから削除したい画像ファイルの名前を取得する

フォームの削除したい画像ファイルのチェックボックスにチェックを入れた画像の名前を$_POSTで受け取ります。この時複数にチェックが入っていれば配列で受け取ることになります。


//チェックされたファイル名を取得
$deletefiles=$_POST["deletefile"];

画像ファイルがサーバーにあるか確認してから削除する

画像ファイルを削除するにあたって複数の場合もあるのでforeach()でファイルごとにfile_exsists()でファイルが存在するか調べます。存在するようであればunlink()で画像を削除します。

file_exists()もunlink()も指定するのは、ファイル名だけでなくファイルまでのパスも指定しましょう。



//チェックされた画像の数だけforeachでぶん回す
//ファイルが実際に存在していた場合にunlink関数で画像ファイルを削除する

foreach($deletefiles as $dfile){
    if(file_exists($dir.$dfile)){
        unlink($dir.$dfile);
    }
}
	 

画像ファイルをサーバーから削除する内容はここまでです。

html側のコード

今度はhtml側のフォームの説明やアップした画像ファイルの一覧表示などについて説明します。

画像をアップするためのフォームの設定

画像をアップするためにはもちろんフォームを使います。

ファイルをアップする場合はenctypeを設定してmultipart/form-dataを指定する必要があります。inputのtypeはfileを指定する事でファイルを選択する事ができます。
またアップロードの処理と判別する為に、hiddenタグで「valueに=”upload”」を指定しておきます。




PHPでエラーの文言を表示させる

アップロード時に日本語、画像ファイル以外、重複チェックのさいにエラーの文言を変数に格納しましたがそれをPHPでhtml上に表示させます。

変数に空でないかチェックした後はforeach()でループさせてエラーの文言をechoで表示させています。




	

画像を一覧表示させフォームを設定する

一覧表示させるプログラムは「 同じ画像ファイルがアップされているか調べる 」処理と同じでscandir()でディレクトリ内のファイルを取得してis_dir()で画像ファイルのみをforeach()のループ処理でimgタグにファイル名を指定すれば大丈夫です。

また、画像を削除する時に画像ファイル名が必要なのでチェックボックのvalue値に画像ファイル名をPHPのechoで設定しておきます。また複数の画像を削除対象にすることもあるのでチェックボックスのname属性にdeletefile[]と配列しておきます。*名前は任意です。

あとは、アップロードと削除の処理を区別するために、hiddenタグでvalue値に「delete」という文字を設定しています。


  
タイトル ファイル名 画像
"; ?>

まとめ

ざっと駆け足でPHPで画像のアップロードと削除を説明しました。画像をアップしたり削除したりするのはいろんなWEBサイトでも使われてるので覚えておいてもよいかと思います。