PHP_ファイル受け取りプログラム例

PHPでファイルを受け取るプログラムを作成したのでここに残しておきます。

ここで注意するのは、$_FILES['ファイル名’]['error’]で取得できる定数についてです。

教本では次のように紹介されています。

定数内容
UPPLOAD_ERR_OKphp.iniのupload_max_filesizeの制限を超えています。
UPLOAD_ERR_INI_SIZEHTMLのMAX_FILE_SIZEを超えています。
UPLOAD_ERR_FORM_SIZEファイルが一部しかアップロードされていません。
UPLOAD_ERR_PARTIALファイルはアップロードされませんでした。
UPLOAD_ERR_NO_FILE一時保存フォルダが存在しません。
UPLOAD_ERR_NO_TMP_DIR一時保存フォルダが存在しません。
UPLOAD_ERR_CANT_WRITEディスクへの書き込みに失敗しました。
UPLOAD_ERR_EXTENSION拡張モジュールによってアップロードが中断しました。

なので$_FILES['ファイル名’]['error’]で取得できる定数は上記のエラーメッセージだと説明がなされていますが、実際は数字(インデックス)になります。

つまり

print_r($_FILES);
print '<br>';

print_r($_FILES['upload']);
print '<br>';

print_r($_FILES['upload']['error']);
print '<br>';

と取得すると

Array ( [upload] =>
      Array ( [name] => python_qiitaテキスト.pdf
              [type] => application/pdf
              [tmp_name] => /Applications/MAMP/tmp/php/phpLlaEJW
              [error] => 0
              [size] => 3232313
            )
      )

Array ( [name] => python_qiitaテキスト.pdf
        [type] => application/pdf
        [tmp_name] => /Applications/MAMP/tmp/php/phpLlaEJW
        [error] => 0
        [size] => 3232313
      )

0

このような結果になります。なので以下のように変数$msgには0~7の数字を入れてあげるとスクリプトが正しく機能します。

<?php
$ext= pathinfo($_FILES['upload']['name']);
$allow= ['png', 'jpg', 'jpeg', 'gif'];
print_r($ext);
print '<br>';
print_r($_FILES['upload']);
print '<br>';
print_r($_FILES['upload']['error']);
print '<br>';
print_r($_FILES);
print '<br>';


if ($_FILES['upload']['error'] !== 0) {    //多分エラーは数字で「0~7」
  $msg=[
    1 => 'php.iniのupload_max_filesizeの制限を超えています。',
    2 => 'HTMLのMAX_FILE_SIZEを超えています。',
    3 => 'ファイルが一部しかアップロードされていません。',
    4 => 'ファイルはアップロードされませんでした。',
    5 => '一時保存フォルダが存在しません。',
    6 => 'ディスクへの書き込みに失敗しました。',
    7 => '拡張モジュールによってアップロードが中断しました。'
  ];
  $err_msg= $msg[$_FILES['upload']['error']];
} elseif (!in_array(strtolower($ext['extention']), $allow)) {
  $err_msg= 'アップロードできるのは画像のみです。';
} elseif (!@getimagesize($_FILES['upload']['tmp_name'])) {
  $err_msg= 'ファイルの内容が画像ではありません。';
} else {
  $tmp= $_FILES['upload']['tmp_name'];
  $fname=/* mb_convert_encoding($_FILES['upload']['name'], 'SJIS-WIN', 'UTF-8')*/
         $_FILES['upload']['name'];
  if (!move_uploaded_file($tmp, 'doc/'.$fname)) {
    $err_msg= 'アップロード処理に失敗しました。';
  }
}
if (isset($err_msg)) {
  die($err_msg);    //dieとexitは同等
}

header('Location: http://'.
      $_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']). '/upload.php');
 ?>

ちなみに、フォーム機能をテストするときはブラウザのキャッシュをリセットしないと反映されない場合がありますのでお気をつけて。

面倒ならsafariやら他のブラウザで確認すれば早いです(笑)