###実現したいこと
現在簡易的なCMSを想定したジェネレータのようなものを作成しており、
ジェネレータからサーバー内に画像をアップロードする処理を作成しております。
▼基本的な動作の流れ
0. inputタグ(type="text")にURLを記載
0. inputタグ(type="file")でアップロードしたいファイルを指定(※1枚~複数枚)
0. ボタンをクリックしてAjaxからPHPにデータを送信
0. PHP側でデータを受け取る
0. 「1」で入力された階層に行きフォルダがあればそのフォルダ内に画像をアップロード
0. 「1」で入力された階層に行きフォルダがなければフォルダを作成したあとそのフォルダに画像をアップロード
###発生している問題
今回発生しているものは、基本的な動作の流れの③にあたる部分です。
送信したいデータは①のURLとなるテキストデータと、②の画像ファイルです。
この①のテキストデータはきちんとPHPに受け渡しができており、この①のデータを元に⑤と⑥のフォルダ判別ができています。
しかし、画像データを送信することができていないためフォルダは作成できても画像がアップロードできません。
###問題のコード
以下コードで実際に動かすと、PHP側から「ajaxから送信されてきたデータが空っぽだよ」が返ってきます。
※フォルダの作成もこの時点ではできていません。
しかしjs内の以下
・var formdata = new FormData($('#img').get(0));
・'formdata': formdata
・processData: false,
・contentType: false,
をコメントアウトして実行すると、フォルダの作成は実行されました。
なのでおそらくはPHP側の問題ではなくjs側の問題だとは思うのですが、原因がわからず困惑しています。
HTML
1<input type="text" name="url" id="url" > 2<input type="file" id="img" name="img" multiple="multiple" accept="image/*"> 3<div id="file_select_uploaed">アップロードボタン</div>
js
1$('#file_select_uploaed').click(function () { 2 var uploadPass = $('#url').val(); // URL文字列を取得 3 var formdata = new FormData($('#img').get(0)); // FormData オブジェクトを作成 4 5 //サーバーに送る画像と作成する階層を指定 6 var data = { 7 'imgPass': uploadPass, 8 'formdata': formdata 9 }; 10 11 $.ajax({ 12 url: 'form.php', 13 type: 'POST', 14 data: data, 15 processData: false, 16 contentType: false, 17 success: function (data) { 18 alert(data); 19 }, 20 error: function (data) { 21 alert("ajaxエラー"); 22 } 23 }); 24});
php
1<?php 2if (!empty($_POST)) { 3 4 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 ここに今回とは関係ない別の処理があります 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 7 8 //==========画像フォルダの作成と画像の書き出し 9 if(!empty($_POST['imgPass'])){ 10 11 $imgPass = $_POST['imgPass']; //作成したいディレクトリ(のパス) 12 $imgData = $_FILES['formdata']['name']; //サーバーに送りたい画像の本来のファイル名 13 14 //URLをフルパスから相対パスに置換 15 $imgPass = str_replace('https://hogehoge/hugahuga/', '../../aaa/bbb/', $imgPass); 16 17 //「$imgPass」で指定されたディレクトリが存在するか確認 18 if(file_exists($imgPass)){ //ディレクトリが存在したときの処理 19 //file_existsでフォルダの中にファイルが存在しているか判定 20 if(file_exists($imgPass.$imgData)) { 21 echo '作成しようとしたファイルは既に存在します。'; // ファイルはすでにあると通知 22 } else { 23 if (move_uploaded_file($imgPass, $imgPass)) { 24 echo $imgData . "をアップロードしました。"; 25 } else { 26 echo "ファイルをアップロードできません。"; 27 } 28 } 29 30 }else{ //ディレクトリが存在しないときの処理(「$imgPass」で指定されたディレクトリを作成する) 31 if(mkdir($imgPass, 0777)){ 32 //作成したディレクトリのパーミッションを確実に変更 33 chmod($imgPass, 0777); 34 35 // file_existsでフォルダの中にファイルが存在しているか判定 36 if(file_exists($imgPass.$imgData)) { 37 echo '作成しようとしたファイルは既に存在します。'; // ファイルはすでにあると通知 38 } else { 39 if (move_uploaded_file($imgData, $imgPass)) { 40 echo $imgData . "をアップロードしました。"; 41 } else { 42 echo "ファイルをアップロードできません。"; 43 } 44 } 45 }else{ 46 //ディレクトリの作成に失敗した時の処理 47 echo "ディレクトリの作成に失敗しました"; 48 } 49 } 50 } 51} else { 52 echo 'ajaxから送信されてきたデータが空っぽだよ'; 53} 54?>
画像を送信しようとすると、PHP側から「ajaxから送信されてきたデータが空っぽだよ」が返ってくるということは
そもそもデータが空?ということになると思うのですが、
画像を送らずURLのテキストのみを送れば動くものが、なぜ画像のデータが含まれると空と判定されるのか理由がわからず…。
そもそもこのjsでは画像が取得できていないのでしょうか?
何卒宜しくお願い致します。
▼参考にしたサイト
・jQuery Ajaxでファイルを送りたい!
・コピペで使う!画像アップロード付きAjax(JQuery)フォームサンプル
・jQueryを使ってajaxでファイル送信
・PHPの入力値確認ではなぜisset関数ではなくempty関数を使うのか
回答1件
あなたの回答
tips
プレビュー