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

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

ただいまの
回答率

88.31%

FILEをアップロードした時にアップロードの条件に入らない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 731

aushijima

score 53

現状起こっていること

ファイルをアップロードした際に、条件に入らないです。

   logger('セッションの値を確認する1'.$_SESSION['upfile'][$i]);


※ログを見ても出力されておらず、条件に入っていないです。

実現したいこと

chat_theme.phpで、ファイルがアップロードされたら、その情報をセッションに入れて、テーマチャット作成ボタンを押した後にChat.phpでDBへのアップロードファイルのパスを登録したり、移動するためのディレクトリを作成して、ファイルをディレクトリに移動するようにしたいと思っています。
登録ボタンを押すまでにファイルをアップロードしたら、エラーがなかったらセッションに格納されているファイルが上書きされて、それが、Chat.phpに送られた(登録されるファイルが確定された状態)時にファイルを移動したいからです。
※これよりももっと良い方法があればそこも教えてください。

仕様など

ファイルのアップロードでは、画像以外の.csv、.txtなどのファイルもアップロードできるようにと考えています。
※添付ファイルを追加するを押すとファイルアップロード部分のhtmlができるようになっており、複数登録をする仕様になっています。
chat_theme.phpなどは、主にフォームのバリデーションチェックや入力した値を登録用や検索用のクラスのChat.phpに送る役目です。
※リロードするとjavaScriptでhtmlのタグを出しているので消えてしまいますが、ここは、この仕様(参考にして欲しいと言われたサイト)に似せています。

 html部分  

<form action="" method="post" name="chat_theme" enctype="multipart/form-data">
       <div id="attachedFileAdd" class="attachedFileAdd">
         <a href="javascript:void(0);" class="fileadd iconLink" onclick="attachFileClick();">
           <img src="" alt="">
           <span>添付ファイルを追加する</span>
         </a>
       </div>
</form>

 js部分

// ##############################################
// 添付画像の処理を記載
// ##############################################
// TODO 番号のリセットなどを実装して、DB上で複数登録させる
//カウンターを設定する
var attachcount = 0;
//添付ファイルのボタンが押された際と削除した際の画像にファイル名を動的に与える為に必要
var attachbox = document.getElementById('attachedFileAdd');
//添付ファイルを追加するボタン
function attachFileClick(){
 //添付ファイルを追加するを押した回数をカウントアップする
 attachcount++;
 var counter = attachcount;
 var test = document.getElementById('ui-id-1');
 //要素内の、最後の子要素の後ろ
 test.insertAdjacentHTML('beforeend',
                         '<div id="cba_commonAttachedFile'+ counter +'"'+'class="attachedFileParts" data-file-count="'+counter +'">'
                         +'<input type="file" size="30" name="file[] class="inputFile">'
                         +'<input type="hidden" name="MAX_FILE_SIZE value="26,214,400">'
                         +'<span class="guide">(25MBまで)</span>'
                         +'<a href="javascript:void(0);" class="attachedFileList__delete attachedFileDeleteiconLink" onclick="deleteFileClick();">'
                         +'<img src="" alt class="icon">'
                         +'<span>削除</span>'
                         +'</a>'
                         +'</div>');

 php部分 chat_theme.php

//テーマチャット作成ボタンが押される前にファイルがアップロードされることは、ないのでファイルがアップロードされたら、セッションに入れておく
//上書きをした場合は、書き換わる
$file_list = array();
for($i=0;$i<count($_FILES['file']);$i++){
 if(empty($_SESSION['upfile'][$i]) || $_FILES['file']['error'][$i] === 0) {
   unset($_SESSION['upfile']);
   $_SESSION['upfile'][$i] = $_FILES['file'];
   logger('セッションの値を確認する1'.$_SESSION['upfile'][$i]);
   //名前の被りを防いで登録するために、拡張子とファイル名の所を分割する(デバッグ用のコード)
   $file_list = preg_split("/[.]/",$_SESSION['upfile']['name'][$i]);
   $_SESSION['filelist'] = $file_list;
 }
//テーマチャット作成時バリデーションチェック
if(!empty($_POST['chat_theme_create'])){
 //グループタイトルのバリデーション
 if(empty($_POST['GROUP_CHAT_TITLE'])){
   $_POST['err'][] = 'タイトルが入力されていません。';
   //グループタイトル文字数上限超過
 }elseif($chat->getGroupChatByName($_POST['GROUP_CHAT_TITLE'])) {
   $_POST['err'][] = '入力されたタイトルは既に登録済みです。';
 }
//バリデーションエラー時に入力画面で表示させる為にセッションに入れておく
 //所属メンバーのリスト
 if($_SESSION['belong_member']){
   //バリデーションエラーにひっかかって後にさらに追加した場合
   $_SESSION['belong_member'] = array_merge($_SESSION['belong_member'],(array)$_REQUEST['addressId']);
 }else{
   //バリデーションエラー前に初回追加した時(複数登録されることを想定して配列にしておく)
   $_SESSION['belong_member'] = (array)$_REQUEST['addressId'];
 }
//グループチャット作成登録画面に遷移してきた時
 if($_GET['edit_type'] == 'register'){
   //ファイルのアップロード状況を確認
   logger('登録ボタンを押した瞬間'.$_SESSION['file']);
   logger('登録ボタンを押した瞬間'.var_dump($_SESSION['file']));
   //エラーがなければ登録処理を行う
   if(empty($_POST['err'])){
     $chat->setGroupChat($_POST['GROUP_GHAT_NO'],$_POST['GROUP_CHAT_TITLE'],$_POST['GROUP_CHAT_MEMO'],$_FILE['file']['tmp_name'],$_POST['modifiable'],$_SESSION['belong_member']);
     //チャットの一覧ページ(ダイレクトページとテーマチャットが一覧で見れるページ)メッセージは、
     $_SESSION['edit_topic_msg'] = 'トピックが'.$chat->getGroupChatEditType($_GET['edit_type']).'されました';
     //登録がうまく行った場合は、ページ遷移させずに表示させていたセレクトボックスの値などのデータをセッションに入れていたものをクリアする
     unset($_SESSION['belong_member']);
     header("Location:chat_top");
   }
 }
}

 

セッションの中身です。

Array (
 [4] => Array (
      [name] => Array ( [0] => テスト確認.txt )
      [type] => Array ( [0] => text/plain )
      [tmp_name] => Array ( [0] => /tmp/php5U3RYZ )
      [error] => Array ( [0] => 0 )
      [size] => Array ( [0] => 14 )
  ) )
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

こちらの質問の回答が参考になりそうです。
https://teratail.com/questions/66833

PHPのマニュアル見ましたが、PHPのファイルは実際にテンポラリフォルダにファイルを置いているみたいですね。
そしてリクエストが完了次第テンポラリのファイルは削除される。
なので、別のトランザクションからテンポラリファイルを見に行っても消えているようです。

トランザクションの異なるリクエストから先にアップロードしたファイルを見るためにはサーバ上で別のフォルダにファイルを移動してあげる必要があるみたいです。
あと使用後のファイルの削除も自分でコードを書く必要があるとのこと。

やってみて下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

'<input type="file" size="30" name="file[] class="inputFile">'

nameの指定の、閉じる「"」が足りてない

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/08 17:33

    ありがとうございます。条件に入ってセッションに値を格納できました。

    キャンセル

  • 2018/11/08 17:42

    ただ、アップロードしたファイル名を.の部分で分割したりできてなくて、理由がわかりません。

    キャンセル

  • 2018/11/08 20:35

    文法エラーやタイプミスを検出できる優秀な開発環境の導入を強くおすすめします。Pleiades(Eclipse)やNetbieans IDEやPhpStormなど。

    キャンセル

  • 2018/11/09 11:15 編集

    ありがとうございます。PhpStormを導入してみました。波線が緑で入っているのが、つづり間違いがある所ですか?セッションへの代入の仕方が良くないから出ている表示なのですか?

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る