今回はPHPでファイルをアップロードする方法を紹介します。
ファイルアップロードの説明
$_FILESについて
グローバルの$_FILESには、アップロードされたファイルの情報が含まれます。
php.ini の upload_tmp_dir ディレクティブで 他の場所を指定しない限り、ファイルはサーバーにおけるデフォルトの テンポラリディレクトリに保存されます。
$_FILES[‘userfile’][‘name’] | クライアントマシンの元のファイル名 |
$_FILES[‘userfile’][‘type’] | ファイルの MIME 型,ブラウザがこの情報を提供する場合、この値は信用できません。 |
$_FILES[‘userfile’][‘size’] | アップロードされたファイルのバイト単位のサイズ |
$_FILES[‘userfile’][‘tmp_name’] | アップロードされたファイルがサーバー上で保存されているテンポラ リファイルの名前 |
$_FILES[‘userfile’][‘error’] | このファイルアップロードに関する エラーコード |
errorについて
UPLOAD_ERR_OK | 値: 0; エラーはなく、ファイルアップロードは成功しています |
UPLOAD_ERR_INI_SIZE | 値: 1; アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています |
UPLOAD_ERR_FORM_SIZE | 値: 2; アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています |
UPLOAD_ERR_PARTIAL | 値: 3; アップロードされたファイルは一部のみしかアップロードされていません |
UPLOAD_ERR_NO_FILE | 値: 4; ファイルはアップロードされませんでした |
UPLOAD_ERR_NO_TMP_DIR | 値: 6; テンポラリフォルダがありません |
UPLOAD_ERR_CANT_WRITE | 値: 7; ディスクへの書き込みに失敗しました |
UPLOAD_ERR_EXTENSION | 値: 8; PHPの拡張モジュールがファイルのアップロードを中止しました |
ファイルタイプ確認
アップロードされたファイルのタイプを確認する方法も複数が存在しますが、今回はFileinfo拡張モジュールでチェックする
ファイルアップロードのコード
<html lang=”ja”>
<head></head>
<body>
<?php
// アップロードファイルのチェック
function file_check($file) {
if ($file[‘error’] != UPLOAD_ERR_OK) {
switch ($file[‘error’]) {
case UPLOAD_ERR_INI_SIZE:
return “アップロードされたファイルは、upload_max_filesizeディレクティブの値(“.
return “アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています”;
case UPLOAD_ERR_PARTIAL:
return “アップロードされたファイルは一部のみしかアップロードされていません”;
case UPLOAD_ERR_NO_FILE:
return “ファイルはアップロードされませんでした”;
case UPLOAD_ERR_NO_TMP_DIR:
return “テンポラリフォルダがありません”;
case UPLOAD_ERR_CANT_WRITE:
return “ディスクへの書き込みに失敗しました”;
case UPLOAD_ERR_EXTENSION:
return “PHPの拡張モジュールがファイルのアップロードを中止しました”;
default:
return “未知エラー”;
}
}
// ファイルタイプチェック
$f_info = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($f_info, $file[‘tmp_name’]);
$allow_mime = [‘image/jpeg’,’image/png’,’image/gif’];
if (!in_array($mime, $allow_mime)) {
return “ファイルタイプ不正”;
}
// ファイルサイズチェック
$allow_size = 30720;
if ($file[‘size’] > $allow_size) {
return “ファイルサイズを超えました。最大:”.number_format($allow_size/1024,1).”K”;
}
// http経由でアップロード
if(!is_uploaded_file($file[‘tmp_name’]))
return “http経由でアップロードしてください。”;
return null;
}
if (!empty($_POST)) {
// チェックエラーの場合
if ($err_msg = file_check($_FILES[‘img_pic’])) {
echo $err_msg;
} else {
//正常の場合
$folder_name=date(‘Y-m-d’);
$folder_path=”./uploads/{$folder_name}”;
if (!is_dir($folder_path))
mkdir($folder_path);
$file_name=uniqid(‘img’,true).strrchr($_FILES[‘img_pic’][‘name’],’.’);
$file_path=”{$folder_path}/{$file_name}”;
if (move_uploaded_file($_FILES[‘img_pic’][‘tmp_name’], $file_path))
echo “upload success”;
else
echo “upload error”;
}
}
?>
<form method=”post” action=”” enctype=”multipart/form-data”>
<input type=”file” name=”img_pic”>
<input type=”submit” name=”button” value=”COMMIT”>
</body>
</html>