Muni Bus

パソコンの操作方法や設定方法を忘れないようにメモしています。ブログを一回引っ越ししているので、所々表示がかなり乱れています・・・

【PHP】ファイルをアップロードする(「独習PHP 第3版」(翔泳社)pp.346-348)

作成したコードはそれぞれ「p346_file1.php」、「p347_file2.php」という名前で保存する。保存の際には、文字コードは「UTF-8」、改行コードは「LF」を指定すること。

ブラウザーでp346_file1.phpを開く。書籍に掲載のスクリプトとは異なり、アップロードしたファイルはスクリプトファイルp347_file2.phpが置かれたフォルダーに保存(コピー)するようにしてある。

p346_file1.php

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>アップロード処理</title>
</head>
<body>
  <form method="POST" action="p347_file2.php" enctype="multipart/form-data">
  <label for="upfile">ファイルのパス:</label>
  <input type="hidden" name="max_file_size" value="1000000">
  <input id="upfile" type="file" name="upfile" size="40">
  <input type="submit" value="アップロード">
</body>
</html>

p347_file2.php

<?php
// アップロードファイルの情報を取得
$ext = pathinfo($_FILES['upfile']['name']);
// アップロードを許可する拡張子を配列で定義
$perm = ['gif', 'jpg', 'jpeg', 'png'];
// アップロード処理そのものの成否をチェック
if ($_FILES['upfile']['error'] !== UPLOAD_ERR_OK) {
  $msg = [
    UPLOAD_ERR_INI_SIZE => 'php.iniのupload_max_filesize制限を超えています。',
    UPLOAD_ERR_FORM_SIZE => 'HTMLのMAX_FILE_SIZE制限を超えています。',
    UPLOAD_ERR_PARTIAL => 'ファイルが一部しかアップロードされていません。',
    UPLOAD_ERR_NO_FILE => 'ファイルはアップロードされませんでした。',
    UPLOAD_ERR_NO_TMP_DIR => '一時保存フォルダーが存在しません。',
    UPLOAD_ERR_CANT_WRITE => 'ディスクへの書き込みに失敗しました。',
    UPLOAD_ERR_EXTENSION => '拡張モジュールによってアップロードが中断されました。'
  ];
  $err_msg = $msg[$_FILES['upfile']['error']];
// 拡張子が許可されたものであるかを判定
} elseif (!in_array(strtolower($ext['extension']), $perm)) {
  $err_msg = '画像以外のファイルはアップロードできません。';
// ファイルの内容が画像であるかをチェック
} elseif (!@getimagesize($_FILES['upfile']['tmp_name'])) {
  $err_msg = 'ファイルの中身が画像ではありません。';
// エラーチェックを終えたら、アップロード処理
} else {
  $src = $_FILES['upfile']['tmp_name'];
  $dest = mb_convert_encoding($_FILES['upfile']['name'], 'SJIS-WIN', 'UTF-8');
  if (!move_uploaded_file($src, './' . $dest)) {
    $err_msg = 'アップロード処理に失敗しました';
  }
}
// エラー発生時はエラーメッセージを表示
if (isset($err_msg)) {
  die('<div style="color:Red;">' . $err_msg . '</div>');
}
// 処理成功時はフォームにリダイレクト
header('Location: http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/p346_file1.php');