###実現したいこと
こちらの<form>
で画像が選択できる機能がjQueryであるのですが、その選択された画像(input
のimg_file
)を送り、PHPで受け取りたいです。
html
1<form class="testform"> 2 <ul id="file_list"> 3 <li class="each_file"> 4 <input type="file" class="input_file" name="img_file" value="" accept="image/*"> 5 </li> 6 </ul> 7 <input type="submit" id="submit_btn" value="画像アップロード"> 8</form>
###発生している問題
$_FILES['img_file']
がPHPで受け取れません。
そのことは次のPHPにある通りecho json_encode($_FILES['img_file']);
としてみたのですが、jQeuryでres=
という風にコンソールに表示され、つまり何も返ってこなかったためにそう判断しました。
###該当のソースコード
php
1function my_ajax_upload_photos() { 2 echo json_encode($_FILES['img_file']); 3 die(); 4}
jQuery
1$(document).on("click",".insert_testform", function(){ 2 insert_testform(); 3}); 4 5function insert_testform(){ 6 // フォームのHTMLを追加 7 const testform = ` 8 <form class="testform A_UploadImg"> 9 <ul id="file_list"> 10 <li class="each_file"> 11 <input type="file" class="input_file" name="img_file" value="" accept="image/*"> 12 </li> 13 </ul> 14 <input type="submit" id="submit_btn" value="画像アップロード"> 15 </form> 16 `; 17 $('body').prepend(testform); 18 19 // 削除がクリックされた場合の処理 20 let $fileList = $('#file_list'); 21 $fileList.on('click.deleteFile', '.delete_btn', function(){ 22 const $li = $(this).closest('.each_file'); 23 $li.remove(); 24 // inputタグ数が4つ未満になった場合に再度表示させる処理 25 const $fileListLI = $('#file_list li input[name=img_file]'); 26 const inputFileNum = $fileListLI.length; 27 // 最後のinputタグを表示する処理 28 const lastInputFile = $fileListLI.eq(-1); 29 if (inputFileNum < 4){ 30 $(lastInputFile).show(); 31 } 32 return false; 33 }); 34 35 // inputタグに画像が追加された場合の処理 36 $fileList.on('change.inputFile', '.input_file', function(e){ 37 const $input = $(this); 38 const $li = $input.closest('.each_file'); 39 const $newLi = $li.clone(); 40 $fileList.append($newLi); 41 42 // サムネイル画像を表示する処理 43 const file = e.target.files[0]; 44 const fileName = file.name; 45 46 // FileReaderオブジェクトの生成 47 let reader = new FileReader(); 48 reader.readAsDataURL(file); 49 50 reader.onloadend = function(){ 51 const fileReader = this; 52 if(fileReader.result){ 53 const thumb = '<div class = "thumbnail"><img src = "' + fileReader.result + '" width = "150px" style = "max-width: 150px;">' + fileName + '<button class = "delete_btn">削除</button></div>'; 54 $li.append(thumb); 55 } 56 return this; 57 }; 58 $input.hide(); 59 60 // 送信データ 61 let fd = new FormData(); 62 fd.append( "file", $('input[name="img_file"]').prop("files")[0] ); 63 const ajax_action = "my_ajax_upload_photos"; 64 fd.append( 'action', ajax_action ); // FormData を送る場合は送信内容をすべてそこに入れる (https://stackoverflow.com/questions/28002627/ajax-response-0-when-using-processdata-and-contenttype-input-file) 65 66 $.ajax({ 67 url: 'http://...', 68 type: 'POST', 69 dataType: 'json', 70 data: fd, 71 // FormData を送る場合は processData と contentType が必要 72 processData: false, 73 contentType: false 74 }) 75 .done(function(res){ 76 c('res=', res); 77 }) 78 .fail(function(XMLHttpRequest, textStatus, errorThrown) { 79 ajax_fail_console(XMLHttpRequest, textStatus, errorThrown); 80 }); 81 //return this; // なんでここでretunしてるの? 82 }); 83}
そしてAJAXの結果のresとして次がコンソールに表示されました。何も返ってこないようです。
jeury
1res=
###試したこと
上の$_FILES['img_file']
でなく、そもそもの$_FILES
を返してみました。
php
1function my_ajax_upload_photos() { 2 //echo json_encode($_FILES['img_file']); 3 echo json_encode($_FILES); // そもそもの`$_FILES`を返してみました。 4 die(); 5}
そうして先ほどのjQueryの$.ajax
の結果のres
は次のようになり、ここを見ると$_FILES['img_file']
がないようだとわかりました。
jQuery
1res={ 2 file: { 3 error: 0 4 name: "gahag-011076.jpg" 5 size: 22963 6 tmp_name: "/tmp/phpZFj7sW" 7 type: "image/jpeg" 8 } 9}
ということは、jQeuryのfd.append( "file", $('input[name="img_file"]').prop("files")[0] );
が疑わしいと思い、これをコンソールに出してみました。
jQuery
1fd.append( "file", $('input[name="img_file"]').prop("files")[0] ); 2console.log( 'files=', $('input[name="img_file"]').prop("files")[0] );
そうして出た結果が次のものです。
jquery
1files=File { 2 lastModified: 1591546547257, 3 name: "gahag-011076.jpg", 4 lastModified: 1591546547257, 5 webkitRelativePath: "", 6 size: 22963, 7 type: "image/jpeg" 8}
これをfd.append
として送る先のjQueryは間違っているのでしょうか?
なにかのネット記事でこう指定していた(コンソールがこの値かはわかりませんがfd.append( "file", $('input[name="img_file"]').prop("files")[0] );
のように指定していました)ので、何がいけないのかわからないのです。
さらに別の記事ではfd.append( "file", $('.testform').get(0) );
という風な指定もあり試したのですが、その状態で同じようにecho json_encode($_FILES);
を返すと、今度はjQeuryのres
が次のように空の配列となりまして、何をしてもわからないでいます。
jQuery
1res=Array[]
夜分に長文で申し訳ございませんが、どなたかご助力頂けませんでしょうか。
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/09 02:09