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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

855閲覧

jQueryでFormData()を送っても、PHPでinputの値が受け取れません

kikijiji

総合スコア3

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/06/08 16:44

編集2020/06/08 16:49

###実現したいこと
こちらの<form>で画像が選択できる機能がjQueryであるのですが、その選択された画像(inputimg_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[]

夜分に長文で申し訳ございませんが、どなたかご助力頂けませんでしょうか。
宜しくお願い致します。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

appendするときにキー名を"file"にしているからresでfileになるのでは?
"img_file"にすればいいと思います。new FormData()と
appendでカスタマイズしたFormDataを送るときはinputのnameは無意味だったはず。

javascript

1fd.append( "file", $('input[name="img_file"]').prop("files")[0] ); 2fd.append( "img_file", $('input[name="img_file"]').prop("files")[0] );

投稿2020/06/09 01:57

sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikijiji

2020/06/09 02:09

>appendでカスタマイズしたFormDataを送るときはinputのnameは無意味だったはず 大当たりです。一晩憔悴しました。どうもありがとうございます。
guest

0

投稿2020/06/08 20:12

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikijiji

2020/06/09 02:07

そちらは特に不要ではないでしょうか? 具体的にどれを指すのかいまひとつ把握しきれていませんが、 <form enctype="multipart/form-data" method="post" name="fileinfo"> の3つのデータ属性ですよね?なくても動作するかと思いますが、まずいですか?
m.ts10806

2020/06/09 02:31

ファイルアップロードならenctypeは必須です。
kikijiji

2020/06/09 04:45 編集

しかし質問のコード(をsousuke様のご回答で修正したもの)では、enctypeはないままでアップロードできていまして…なんでしょうね…。
sousuke

2020/06/09 06:16

formタグ自体不要ですよこのやり方だと。 formオブジェクトからsubmitしていればformタグに要ると思いますが 今は$.ajaxで直接postしているのでformタグに属性をどれだけ書いても関係ないです。 むしろこの属性を書くとsubmitとクリックイベントの$.ajaxで2重にpostするようになると思います。 ややこしいので<input type="submit" id="submit_btn" value="画像アップロード"> を<button type="button" id="submit_btn">画像アップロード</button>みたい感じに変えたほうがいいと思います。
kikijiji

2020/06/09 07:27

ご親切にどうもありがとうございます!助かります!確かにajaxのpostはformタグを参照するわけではないですもんね。仰る通りformタグはややこしいので外し、inputもbuttonに変えておきたいと思います。
m.ts10806

2020/06/09 09:48

確かにそうですね。 あまりスポットでそこだけアップロードすることがないので気づきませんでした。 (Ajaxアップロードするときはたいていtype=fileをhiddenにした別formに入れてました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問