質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

PHP : 画像アップロード時の$_FILESの中身が見られない

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 738

0isekai

score 7

環境はMAMP、PHPのバージョンは7.1.19です。
フレームワーク等は使用しない、LPサイトのコンタクトフォームを想定しています。

※コードが長いため、極力質問内容に該当しない部分は削除しています

以下、form.htmlにて画像を選択し、「確認画面へ」のsubmitををプッシュ後、confirm.phpにて画像アップロード処理のコードを加えるために、ログに$_FILESにて画像データを表示させたいです。

しかし、error_log ('confirm-files:' . print_r($_FILES,true), '0');にて、ログファイルに$_FILESの中身を表示しようとしても、Array()と表示されるだけで、中身が見れません。ちなみに$_POSTではファイル名が表示されます。

なぜ$_FILESの中身が見られないのか、原因を教えてください。

この後はデータベースは使わずにサーバーにtmpファイルとして保存、thanks.phpに遷移後、顧客管理システムに登録する処理を加える予定です。
よろしくお願いいたします。

・コンタクトフォーム

<form method="post" action="<?=$sfm_script?>" class="form" enctype="multipart/form-data">
  <div class="file">
     <label for="file1">ファイルを選択
         <input type="file" id="file1" name="file1" onchange="$('.file_name1').text($(this).val())" class="file_name1"></label><span class="file_name1">

  </div>
 <button type="submit">確認画面へ</button>
 <input type="hidden" name="mailToNum" id="mailToNum" value="3">
 <input type="hidden" name="autoReply" id="autoReply" value="1"> 
 <input type="hidden" name="mode" id="mode" value="CONFIRM">
<?php if (array_key_exists('pram', $formvalue)):?>
 <input type="hidden" name="pram" id="pram" value="<?=$formvalue['pram']?>">
<?php else:?>
 <input type="hidden" name="pram" id="pram" value="">
<?php endif; ?>
</form>

・確認画面用のphp(別途htmlファイルにフォーム内容は表示)

<?php header("Content-type: text/html; charset=utf-8") ?>
<?php

// 設定ファイル読み込み
include_once('config.php');

// 内部エンコードを設定
if (!extension_loaded('mbstring')) {
    Err('mbstring関数');
}
$internalEnc = 'UTF-8';
mb_language('ja');
mb_internal_encoding($internalEnc);

// メイン
if (!isset($mailTo[0])) {
    Err('メールアドレス');
}
$mode = (isset($_POST['mode'])) ? $_POST['mode'] : '';
$script_name = preg_replace('/.+\/(.*)/', '$1', $_SERVER['REQUEST_URI']);

error_log ('confirm-files:' . print_r($_FILES,true), '0');

switch ($mode) {
case 'SEND': //メール送信
    session_cache_limiter('nocache');
    session_start();
    if (!isset($_SESSION['SFM'])) {
        Err('セッション');
    }
    $mailTo = (isset($mailTo[$_SESSION['SFM']['mailToNum']])) ? $mailTo[$_SESSION['SFM']['mailToNum']] : $mailTo[0];

    // 指定先にメール送信
    include_once('soushin.php'); // メール送信用PHP
    $mailFrom = ($replyAddress) ? $replyAddress : $mailTo;
    if ($replyName) {
        $mailFrom = $replyName . ' <' . $mailFrom . '>';
    }
    SendMail($mailTo, $mailSubject, $mailMessage, $mailFrom, $mailCc, $mailBcc);
    // メール自動返信
    if ((isset($_POST['autoReply']) || isset($_SESSION['SFM']['autoReply'])) && isset($_SESSION['SFM']['email']) && is_file('henshin.php')) {
        include_once('henshin.php'); // 自動返信用PHP
        $replyAddress = ($replyAddress) ? $replyAddress : $mailTo;
        if ($replyName) {
            $replyAddress = $replyName . ' <' . $replyAddress . '>';
        }
        SendMail($_SESSION['SFM']['email'], $replySubject, $replyMessage, $replyAddress, $replyCc, $replyBcc);
    }

    unset($_SESSION['SFM']);
    include_once('thanks.html'); // 完了画面HTML
    break;

case 'CONFIRM': // データ処理と確認
    if ($_SERVER['HTTP_REFERER'] != 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] && $refCheck) {
        Err('外部から利用は出来ません');
    }
    session_cache_limiter('nocache');
    session_start();
    unset($_SESSION['SFM']);

    $error = $email = '';
    foreach ($_POST as $key => $value) {
        if (is_array($value)) {
            $value = implode("\t", $value);
        }
        if (!$ill_slash) {
            $value = (!get_magic_quotes_gpc()) ? addslashes($value) : $value;
        }
        if (!$ill_char) {
            $value = mb_convert_encoding($value, $internalEnc, $baseEnc);
        }
        $value = mb_convert_kana($value, 'KV', $internalEnc);
        $name = preg_replace('/(.+)_i$/', "$1", $key);
        if (preg_match('/_i$/', $key) && $value == '') {
            $_SESSION['SFM'][$name] = '::INPUT ERROR::';
            $error = 1;
        } elseif ($name == 'email' && $value) {
            if (!preg_match("/^[\w\-\.\+]+\@[\w\-\.]+\.([a-z]+)$/", $value)) {
                $_SESSION['SFM']['email'] = '::EMAIL ERROR::';
                $error = $email = 1;
            } else {
                $_SESSION['SFM']['email'] = $email = $value;
            }
        } elseif ($name == 'emailcheck') {
            if ($email != 1 && $email != $value) {
                $_SESSION['SFM']['email'] = '::EMAIL CHECK ERROR::';
                $error = 1;
            }
        } elseif ($maxText && strlen($value) > $maxText) {
            $_SESSION['SFM'][$name] = '::MAXTEXT ERROR::';
            $error = 1;
        } else {
            $_SESSION['SFM'][$name] = $value;
        }
    }
    $_SESSION['SFM']['InputErr'] = $error;
    //$sfm_script = $script_name . ((SID) ? '?'.strip_tags(SID) : '');
    $sfm_script = "thanks.php"; // 次画面 完了用PHP
    include_once('confirm.html'); // 確認画面HTML
    break;
default: // 入力フォーム表示
    session_cache_limiter('private_no_expire');
    session_start();
    unset($_SESSION['SFM']);
    //$sfm_script = $script_name;
    $sfm_script = "confirm.php"; // 次画面 確認用PHP
    include_once('form.html'); // 入力用HTML
}
exit;
// HTMLデータ整形
function FORM_DATA_H($name) {
    $errArray = array(
        '::INPUT ERROR::' => '<span class="req">必須項目</span>',
        '::EMAIL ERROR::' => 'メールアドレスが不正です',
        '::EMAIL CHECK ERROR::' => 'メールアドレスが一致しません',
        '::MAXTEXT ERROR::' => '文字数が多すぎます(上限 ' . number_format($GLOBALS['maxText']) . '字)'
    );
    $value = (isset($_SESSION['SFM'][$name])) ? $_SESSION['SFM'][$name] : '';
    $value = (get_magic_quotes_gpc()) ? stripslashes($value) : $value;
    $value = str_replace("\t", "\n", $value); // 表示用に複数項目を改行
    $value = nl2br(htmlspecialchars($value, ENT_QUOTES, 'UTF-8'));
    $value = (preg_match('/::.+::/', $value)) ? '<span class="ERR">' . $errArray[$value] . '</span>' : $value;
    $value = ($value != '') ? $value : '&nbsp;';
    return mb_convert_encoding($value, $GLOBALS['baseEnc'], $GLOBALS['internalEnc']);
}

?>

・confirm.phpに遷移時の$_FILESのログ

[10-Mar-2019 09:15:55 Asia/Tokyo] files:Array
(
)

・今後追加したいアップロード処理

//foreach(配列名 as $key => $value)
foreach ($_FILES as $key => $file) {
    if ($file['size'] > 0) {
        //英文形式の日時をUNIXタイムスタンプに変換する
        $time = strtotime('today');
        // ファイルまたはディレクトリが存在するかどうか調べる
        if (!file_exists('./files/' . $time)) {
            // 保存用フォルダを作る
            mkdir('./files/' . $time);
            // パーミッションを設定
            chmod('./files/' . $time, 0777);
        }
        $tmp_name = str_replace('/Applications/MAMP/tmp/php', '', $file['tmp_name']);
        move_uploaded_file($file['tmp_name'], './files/' . $time . $tmp_name);
        $_FILES[$key]['tmp_name'] = './files/' . $time . $tmp_name;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

var_dump($_FILES);
でファイルが本当に転送されているか確認してみてください。空ならばphp.iniのデフォルト設定によって、2Mより大きなファイルを転送できないトラップにひっかかってる恐れが高いです。PHP経験者にとって最も引っかかるトラップの一つだと自分は思ってます。

php.iniから

upload_max_filesize = 2M

ここの値を2Mから容量を増やしてから、apacheを再起動してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

PHPマニュアル的には下記
$_FILESからPOST メソッドによるアップロード

<!-- データのエンコード方式である enctype は、必ず以下のようにしなければなりません -->
<form enctype="multipart/form-data" action="URL" method="POST">

注意:
アップロード用のフォームが enctype="multipart/form-data" 属性を有しているかを 確認してください。さもないと、ファイルのアップロードは動作しません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/10 10:25

    ご回答ありがとうございます。
    確かにenctype="multipart/form-data"を入れ忘れておりました。
    ただ、それでも$_FILESが表示されないのですが、他に懸念点はありますでしょうか?

    キャンセル

  • 2019/03/10 10:55

    コードをためしたわけではないですが、multipleではない、name[]にしてないinput fileをforeachしてるからかなあと。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる