Web.fla

主食は、html/css/php/javascript(jQuery) デザートはactionscript!WEBに関することをメモってくサイト

*

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

      2016/01/07

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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サイトでも使われてるので覚えておいてもよいかと思います。

 - php ,

     

Comment

  1. […] Web.fla「【PHP】画像ファイルのアップロードから削除までの流れ」 […]

Message

  関連記事

no image
mysqlの文字化け対策

フォームから入力した値をmysqlのテーブルに登録するときに日本語が化けてしまっ …

【PHP】WebサービスのAPIを使ってCSVファイルを作ってみた!

久々にPHPのネタでも書こうかと。 PHPとってもここ最近いろんなWebサービス …

PHPでユーザーエージェントを判別

前回はjavscriptでユーザーエージェントを判別していたが、PHPもついでに …

【PHP】CSV ファイルをダウンロードするプログラムは?

phpでCSVをダウンロードする時って割と見ると思うんですが、そういえばphpで …

【PHP】URLを分解して配列で取り出すには?

PHPでプログラムをするとやっぱURLって結構いじるときありますよね。 例えば、 …

【PHP】ftruncateでファイルの中身を上書きするには?

たまたま、ファイルの中身を別のファイルに書き換えるというか上書きするようなことを …

【PHP】サムネイル画像を作成・保存

よくプロフィール画像をアップしたりするとサムネイル画像を表示するときがあると思う …

【PHP】phpでファイルのアップロード

ファイルのアップロードのシーンって結構ありそうなの定型文のようにメモっておこう。 …

【wordpress】個別記事ページでアイキャッチ画像に元画像へのリンク張るには?

まぁwordpress最近全く弄ってません。なぜなら最近は、すばらしいテーマがあ …

【PHP】画像をダウンロードして特定のディレクトリに保存する方法

よくブラウザで画像を右クリック名前をつけて保存。なんていうのやることあるけど、p …