ファイルのアップロード平成30年 11月 16日 作成

00166

概略

不正な操作でのアップロードは排除しつつファイルをアップロードできる環境を構築する。

手段

今回、単一ファイル画像をアップロードする為に必要なコードを記載。


アップロードの流れ

  • アップロードフォームよりファイルを選択しアップロード。サーバーで一時保管される。
  • 各エラーチェックを実施。
  • 一時保管から正式保管場所へ移動させる。

実装方法

HTML

<form method="POST" action="uploader" enctype="multipart/form-data" accept-charset="utf-8">
	// ファイルサイズ上限を30MBに指定
	<input type="hidden" name="MAX_FILE_SIZE" value="31457280" />
	<input type="file" name="upfile" />
	<input type="submit" value="アップロード" />
</form>

enctype:multipart/form-dataを設定

input type:fileを設定

PHP

<?php
	header('Content-Type: text/html; charset=utf-8');
	
	// ファイル形式判定時使用の連想配列
	$imagetype_number = array(1 => "gif", 2 => "jpg", 3 => "png", 5 => "psd", 6 => "bmp", 7 => "tiff");
	
	// 改竄されたフォームからの複数ファイル配列送信対策 正常にアップロードされると「0」
	if(!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])){
		echo 'パラメーター不正';
	}else{
		if($_FILES['upfile']['error'] !== 0){
			// エラーが発生している場合にエラー内容を特定する為「error_message()」関数へ渡す
			echo error_message($_FILES['upfile']['error']);
		}else{
			// ファイルサイズ確認(30MB)
			if($_FILES['upfile']['size'] > 31457280){
				echo 'ファイルサイズ超過です';
			}else{
				// ファイル形式判定
				if(!in_array(@exif_imagetype($_FILES['upfile']['tmp_name']), array_keys($imagetype_number))){
					echo '許可されていない画像形式ファイルです';
				}else{
					// 拡張子を取得し小文字に統一する
					$extension = mb_strtolower(pathinfo($_FILES['upfile']['name'], PATHINFO_EXTENSION));
					// 新しいファイル名に変更する
					$new_filepath = __DIR__.'/../../upfile/'.'upfile'.'-'.date("YmdHis").'.'.$extension;
					if(!move_uploaded_file($_FILES['upfile']['tmp_name'], $new_filepath)){
						echo 'ファイルを保存できませんでした';
					}else{
						// ファイルのパーミッションを確実に0644に設定する
						chmod($new_filepath, 0644);
						echo 'ファイルアップロード成功';
					}
				}
			}
		}
	}
	
	function error_message($eror_number){
		switch($eror_number){
			case 1:
				$error_message = 'アップロードされたファイルサイズが制限を超えています';
				break;
			case 2:
				$error_message = 'アップロードされたファイルサイズが制限を超えています';
				break;
			case 3:
				$error_message = 'アップロードされたファイルは一部のみしかアップロードされていません';
				break;
			case 4:
				$error_message = 'ファイルを選択して下さい';
				break;
			case 6:
				$error_message = 'テンポラリフォルダがありません';
				break;
			case 7:
				$error_message = 'ディスクへの書き込みに失敗しました';
				break;
			case 8:
				$error_message = 'PHP の拡張モジュールがファイルのアップロードを中止しました';
				break;
		}
		return $error_message;
	}
?>

考察

エラー表記に関しては、関数で処理。

最後までお読み下さり ありがとうございました。記事はここ迄です。

尚、本記事は作成から「5年以上」経過しています。

記事作成当時と現在の状況等により内容が適切でない場合があります。また、リンク切れが生じている場合もあります事を予めご了承下さい。

お気に入りに登録しますとお気に入り記事を一元管理でき、再度閲覧したい場合等 容易に記事を探し出す事ができますのでご活用下さい。

下段にはコメントを掲載しております。

広告バナー

コメント

頂いたコメントを下記に掲載しております。更に下部にはコメント投稿フォームを設けております。

注意事項を確認・了承した上、コメント投稿お願いいたします。

注意事項に該当するコメントにつきましては、事前告知なしに投稿したコメントの削除を行う場合があります。

予めご了承下さい。

  • 記事内容と無関係なコメント
  • 公序良俗に反するコメント
  • 個人情報や法令違反を含むコメント
  • その他、管理者が不適切と判断したコメント

現在 頂いているコメントはありません

返信先(コメント管理番号)コメントに対し返信する場合のみ
お名前・ハンドルネーム2~32文字内で入力下さい
メールアドレス公開される事はありません
電話番号半角数字+ハイフンで入力下さい
コメント全角500文字内で入力下さい