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

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

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

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

Q&A

解決済

1回答

3958閲覧

jQuery で FormData() に .append() しても、PHPで一部しか受け取ることができません

kikijiji

総合スコア3

jQuery

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

0グッド

0クリップ

投稿2020/06/09 13:25

###実現したいこと
画像アップロード機能を実装しています。画像以外のデータをPHPで受け取りたいです。

###発生している問題
以下のようにFormData().append()しているのですが、PHPで受け取れるのはfileだけで、それ以降にapend()したはずのprocessacitonが受け取れません。

###該当のソースコード
このPHPですが、resに向かってemptyを返してしまうのが問題です。

php

1function my_ajax_upload_photos() { 2 3 $file = $_FILES['file'] ?? ''; 4 $process = $_FILES['process'] ?? ''; 5 6 if( $file === '' || $process === '' ) die('empty'); 7 8 // 受け取った値がきちんとあればこれ以降の処理を実行していく 9}

上記PHPに送っているjQueryはこちらになります。

html

1<input type="file" class="input_file" name="img_file" value="" accept="image/*">

jQeury

1$(document).on('change','.input_file', function(e){ 2 console.log('ファイルが選択されました'); 3 const file = e.target.files[0]; 4 5 // FileReader オブジェクト 6 let reader = new FileReader(); 7 reader.readAsDataURL(file); 8 reader.onloadend = function(){ 9 const fileReader = this; 10 const base64_str = fileReader.result || ''; 11 if( base64_str ){ 12 const type = file.type; 13 if( type === 'image/jpeg' || type === 'image/png' ){ 14 $('img.target').attr( 'src', base64_str ); // 選択画像を表示 15 }else{ 16 console.log('画像じゃないとダメです'); 17 } 18 } 19 }; 20 21 // 送信データ 22 let fd = new FormData(); 23 fd.append( 'file', file ); 24 fd.append( 'action', 'my_ajax_upload_photos' ); 25 fd.append( 'process', 'default' ); 26 27 // 保存 28 $.ajax({ 29 url: 'http://...', 30 type: 'POST', 31 data: fd, 32 processData: false, 33 contentType: false 34 }) 35 .done(function(res){ 36 c('res=', res); // die('empty') されてしまう 37 }) 38 .fail(function(XMLHttpRequest, textStatus, errorThrown) { 39 }); 40});

###試したこと
$_FILES['file']だけならできました。
なので、もしかしたら$_FILESで送れるのは一つだけなのかと考えました。
そこで、append()を一つだけにして、まとめてfilesというオブジェクトで送ってみました。

jQuery

1$(document).on('change','.input_file', function(e){ 2 console.log('ファイルが選択されました'); 3 const file = e.target.files[0]; 4 5 // FileReader オブジェクト 6 /*---- 7 同上 8 -----*/ 9 10 // 送信データ 11 let fd = new FormData(); 12 const files = { 13 file : file, 14 action : 'my_ajax_upload_photos', 15 process: 'default' 16 }; 17 fd.append( 'files', files ); 18 19 // 保存 20 /*---- 21 同上 22 -----*/ 23});

でPHPもfilesの1つだけを受け取ったのですが、こうするとJSのresに向かって何かが返ることもなく400エラーとなってしまいます。

php

1function my_ajax_upload_photos() { 2 3 $files = $_FILES['files'] ?? ''; 4 $file = $files['file'] ?? ''; 5 $process = $files['process'] ?? ''; 6 7 if( $file === '' || $process === '' ) die('empty'); 8 9 // 受け取った値がきちんとあればこれ以降の処理を実行していく 10}

どのようにしましたら、FormData().append()した複数の値をPHPで受け取ることができるでしょうか。
ご回答どうぞ宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

fd.append( 'action', 'my_ajax_upload_photos' );
fd.append( 'process', 'default' );

action : 'my_ajax_upload_photos',
process: 'default'

もファイルではなく文字列を送ってるので
type: 'POST',なら$_POSTです。

外部から来る変数

ファイルは$_FILESで良いです。

投稿2020/06/09 13:34

m.ts10806

総合スコア80850

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

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

kikijiji

2020/06/09 13:44

なるほど…!どうもありがとうございます。
m.ts10806

2020/06/09 13:48

JavaScript関係なく、まずはPHPで単純なフォーム送信作られては。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問