画像をアップロードの流れ
- フォームからファイルを受け取り、バリデーションする。
- 問題がなければ、サーバーの一時フォルダに保管。
- move_uploaded_file()で一時フォルダから指定のパスに移動させ、保存。
画像ファイルを送るフォーム
index.php
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input name="image" type="file" accept="image/*">
<input type="submit" value="送信">
</form>
フォームから画像ファイルを受け取る
グローバル変数「FILES」
$_FILES['upload']['tmp_name']はアップロードされたファイルの情報が格納されたグローバル変数です。
upload.php
image = $_FILES['image'];
imageValidate($article,$image);
画像のバリデーションし、ファイルを一時ファイルから指定ファイルへ移動。(DBに保存して完了)
function.php
public function imageValidate($article,$image){
$result = false;
$filename = basename($image['name']);
$tmp_path = $image['tmp_name'];
$file_err = $image['error'];
$filesize = $image['size'];
$upload_dir = '/path';
$save_filename = date('Ymdhis') . $filename; //ファイル名に日付を入れて保存する
$err_msg = array();
$save_path = $upload_dir.$filename;
//ファイルのバリデーション
//ファイルサイズは1MB未満か確認
if ($filesize > 1048576 || $file_err == 2) {
array_push($err_msg, 'ファイルサイズは1MB未満です。')
}
//許可する拡張子を指定
$allow_ext = array('jpg', 'jpeg','png');
//ファイルの拡張子を取得
$file_ext = pathinfo($filename, PATHINFO_EXTENSION);
//配列の中にあるか確認
if (!in_array(strtolower($file_ext), $allow_ext)) {
array_push($err_msg, '指定の画像ファイルを添付して下さい');
}
//エラーがあればエラーメッセージを返す
if (count($err_msg) === 0) {
//ファイルはあるかどうか確認、あれば一時ファイルから指定のディレクトリに移動
if (is_uploaded_file($tmp_path)) {
if(move_uploaded_file($tmp_path,$upload_dir.$save_filename)){
fileSave($$save_filename); //DBに保存する関数
}else{
array_push($err_msg, 'ファイルが保存されませんでした。');
}else{
array_push($err_msg, 'ファイルが選択されていません。');
}
}else{
return $err_msg;
}
}
FILES [ アップロードフォームのinput name値 ] [ アップロードされたファイル情報の項目 ]
最初の[]にはHTMLアップロードフォームのinput属性のname値が設定されます。
2番目の[]にはアップロードされたファイル情報の項目が入ります。
ちなみに$_FILESの中身は以下のような連想配列になっています。
Array(
[name] => memo.txt
[type] => text/plain
[tmp_name] => /var/tmp/php7UNOJY
[error] => 0
[size] => 45
)
項目 | 内容 |
---|---|
name | 元ファイル名 |
type | ファイルタイプ |
tmp_name | サーバーに一時保管されたファイル名 |
error | エラーコード |
size | ファイルのバイト数 |
エラーコードは0ならアップロード成功で、1〜4、6〜8は以下のようなエラーになります。
コード | エラー定数 | 説明 |
---|---|---|
0 | UPLOAD_ERR_OK | エラーなし |
1 | UPLOAD_ERR_INI_SIZE | php.iniのupload_max_filesizeのサイズを超えている |
2 | UPLOAD_ERR_FORM_SIZE | HTMLフォームで指定された MAX_FILE_SIZE を超えている |
3 | UPLOAD_ERR_PARTIAL | 一部のみしかアップロードされていない |
4 | UPLOAD_ERR_NO_FILE | アップロードされなかった |
6 | UPLOAD_ERR_NO_TMP_DIR | サーバー一時保管フォルダがない |
7 | UPLOAD_ERR_CANT_WRITE | ディスクへの書き込みに失敗 |
8 | UPLOAD_ERR_EXTENSION | PHPの拡張モジュールがアップロードを中止した |
注意する
※下記のように記述していた場合にファイルが最大サイズを超えると、
$_FILESの['type']['tmp_name']は空で送られてしまう。
<input type="hidden" name="MAX_FILE_SIZE" value="1048576">