前提・実現したいこと
現在、Laravelで画像を投稿するフォームを作成しています。
この時、通常のsubmitボタンと、投稿を一時保存するボタンの2つに分け、
submitは通常通りpostさせて、一時保存の場合はajaxを使用し、画面を表示し続けたまま投稿する処理としました。
この場合に、Controller側でバリデーションを作成するため、
__$_FILES__の中身の情報を使ってデータの情報を取得しようとした際、Chrome、Edgeと、IE11で動作差分が出ており、
特にIE11でエラーが発生する挙動となってしまっており、修正したいのですが何が原因なのかまったく見当がつかない状態ですのでご教示いただけないでしょうか。
発生している問題・エラーメッセージ
一時保存ボタンを複数回選択した際、 Chrome、Edgeでは$_FILESの中の配列情報の定型が保持され続けるが、 IE11のみ配列情報が保持されない。
該当のソースコード
formphp
1... 2 3<form action="{{route('confirm')}}" method="POST" name="post" enctype="multipart/form-data" id="post"> 4 <input type="text" name="title" id="title" value="{{old('title')}}" minlength="1"> 5 <input type="file" name="upfile[]" accept='image/*' class="uplaod-files" id="button1"> 6 <input type="file" name="upfile[]" accept='image/*' class="uplaod-files" id="button2"> 7 <input type="file" name="upfile[]" accept='image/*' class="uplaod-files" id="button3"> 8 <input type="file" name="upfile[]" accept='image/*' class="uplaod-files" id="button4"> 9 10 <button id="OneTimeSave">一時保存する</button> 11 <button type="submit">入力内容の確認へ</button> 12</form> 13 14... 15 16<script> 17 //一時保存ボタン押下時処理 18 $("#OneTimeSave").on("click",function(){ 19 $('#OneTimeSave').prop('disabled',true); 20 var formData = new FormData($("#post").get(0)); 21 var url = "{{ route('OneTimeSave')}}"; 22 $.ajax({ 23 url:url, 24 type:"POST", 25 data:formData, 26 contentType:false, 27 processData:false, 28 }).done(function(data){ 29 $('#OneTimeSave').prop('disabled',false); 30 alert("一時保存に成功しました!"); 31 }).fail(function(){ 32 $('#OneTimeSave').prop('disabled',false); 33 alert("一時保存失敗…。"); 34 }); 35 return false; 36 }); 37</script> 38 39...
postController
1public function oneTimePost(Request $request) 2 { 3 $extensions = "(jpg|jpeg|png|bmp)"; 4 foreach ($_FILES['upfile']['type'] as $type) { 5 if(!(empty($type)) && (preg_match($extensions, $type) === 0)) { 6 return response("extension_error", 400); 7 } 8 ...(以降、他バリデーションや保存処理)
問題となっている情報
ChromeEdge
1id="button4"にのみ画像を添付した場合… 2一時保存を複数回選択した場合でも、$_FILESから以下の情報が取得できる。 3 4{"FILES": 5 {"upfile": 6 {"name":["","","","gazou4.jpg"], 7 "type":["","","","image/jpeg"], 8 "tmp_name":["","","","/tmp/phpnJS3hW"], 9 "error":[4,4,4,0], 10 "size":[0,0,0,287928] 11 } 12 } 13}
IE11
1id="button4"にのみ画像を添付した場合… 2一時保存を複数回選択した場合、1回目はChromeやEdgeと同様だが 32回目以降は$_FILESの中身が以下となる。 4 5{"FILES": 6 {"upfile": 7 {"name":["gazou4.jpg"], 8 "type":["image/jpeg"], 9 "tmp_name":["/tmp/phpnJS3hW"], 10 "error":[0], 11 "size":[287928] 12 } 13 } 14} 15 162回目以降であっても、ChromeやEdgeの動作と同様に、 17添付されていないインプットタグの部分はemptyとなるようにしたい
試したこと
現在わかっていることとして、一時保存後ページのリロードを挟めば該当の状況にはならず、
同一セッションで何度も一時保存を行った場合に$_FILESの中身が変わってしまうという状況を確認しています。
尚、IE11の2回目以降の動作の場合で、途中でほかの画像を添付した場合には、添付したファイルの情報が追記される形とはなりますが、
その場合でも画像が添付されていないフォームの情報は空とならずそもそも$_FILESから失われている状況が継続します。
補足情報(FW/ツールのバージョンなど)
・Chromeバージョン : 88.0.4324.190(Official Build)(64 ビット)
・Edgeバージョン : 88.0.705.81 (公式ビルド) (64 ビット)
・Laravelバージョン : Laravel Framework 6.4.0
回答1件
あなたの回答
tips
プレビュー