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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Ajax

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

Q&A

1回答

6025閲覧

ajaxで画像をformDataを使って送信できない

kobe-color

総合スコア11

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Ajax

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

0グッド

0クリップ

投稿2016/09/03 07:20

編集2016/09/05 12:48
<form action="同じページ"> <input type="file" name="file" ・・・/> <div>ドラッグ&ドロップ</div> <img id="image" alt=""> いろいろ<input>や<textarea>など住所録のようなフォーム <input type="submit"・・/> </form>

上記のように、ファイル選択とドラッグ&ドロップの2つを用意し、どちらを使っても<img>に対してDOM操作を行い画像を表示させるようにしました。ここまでは問題なくできています。

スクリプトでドラッグした後の処理に、画像を<img>に表示させたあとに、サーバー側にアップロードをさせたくスクリプトを書いたのですが、ドラッグ&ドロップのほうがアップロードできずに困っています。

アップロードですが、$_FILEに一時的に保存させるだけをしたいのです。
いろんなサイトを見ると、アップロード=$_FILEに一時保存させた後にすぐmoveを使って移動させることを、ajaxのバック関数(php)でさせているものが多いので、なかなか一時保存にたどり着きません。

スクリプト側は以下のとおりです。
関数imageFileUploadの内容がおかしいのではと思うのですが、よくわかりません。
フロントエンドにwordpressを使っていますが、使う画面は公開画面レベルなので独自のajaxにしています。

どなたか見ていただけないでしょうか?

window.onload=function() { var print_img_id = 'print_img'; var print_DataURL_id = 'print_DataURL'; if (checkFileApi()){ var file_image = document.getElementById('file-image'); //ファイル選択 file_image.addEventListener('change', selectReadfile, false); var dropZone = document.getElementById('drop-zone'); //ドラッグオンドロップ dropZone.addEventListener('dragover', handleDragOver, false); dropZone.addEventListener('drop', handleDragDropFile, false); } function checkFileApi() { // FileAPIに対応しているか // Check for the various File API support. if (window.File && window.FileReader && window.FileList && window.Blob) { return true; // Great success! All the File APIs are supported. } alert('The File APIs are not fully supported in this browser.'); return false; } function selectReadfile(e) { //ファイルが選択されたら読み込む var file = e.target.files; var reader = new FileReader(); //dataURL形式でファイルを読み込む reader.readAsDataURL(file[0]); //ファイルの読込が終了した時の処理 reader.onload = function(){ readImage(reader, print_img_id, print_DataURL_id); } } function handleDragOver(e) { //ドラッグ&ドロップ e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy. } function handleDragDropFile(e) { e.stopPropagation(); e.preventDefault(); var files = e.dataTransfer.files; // FileList object. var file = files[0]; var reader = new FileReader(); reader.readAsDataURL(file); //dataURL形式でファイルを読み込む reader.onload = function(){ //ファイルの読込が終了した時の処理 readImage(reader, print_img_id, print_DataURL_id); //処理(1) imageFileUpload(files[0]); //処理(2) } } //ファイルの読込が終了した時の処理(1)HTML書き出し function readImage(reader, print_image_id, print_DataURL_id ){ //ファイル読み取り後の処理 var result_DataURL = reader.result; var img = document.getElementById('image'); //読み込んだ画像とdataURLを書き出す var src = document.createAttribute('src'); src.value = result_DataURL; img.setAttributeNode(src); } //ファイルの読込が終了した時の処理(2)ファイルをアップロード function imageFileUpload(f){ var formData =new FormData(); formData.append('image', f); $.ajax({ type:'POST', contentType:false, processData:false, url:'http://xxxxxxx.xxx/public_html/wp-content/uploads', data:formData, dataType:'json', success:function(data){ //何かする。デバッグしたいがalert出力できない。??? }, error:function(data){ //何かする } }); } }

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

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

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

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

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

kei344

2016/09/03 07:42

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
kobe-color

2016/09/03 08:14

慣れないものですみません。kei344さん、前回も回答いただいた方ですね。ありがとうございます。
kei344

2016/09/03 08:27

質問文は編集が可能です。ここのエリアは回答ではなく情報の追加・修正の依頼フォームです。また、例示用ドメインはご自身で所有されていない限りexample.comを利用してください。
kobe-color

2016/09/09 23:42

kei344さんご回答ありがとうございました。firebugを使ってデバッグのやり方がわかってきたので調べると、私が上記ソースをwordpressで組み込んでいることが原因で、ajax通信ができていいないか、ajax指定に何か原因があるかではないかと思えてきました。通常のhtmlでは問題なくできました。google検索するとwordpressに用意されているajax通信を使わなくてもオリジナルでajax通信ができると私は理解していたのですが、何かしら渡しの認識違いをしているのかもしれません。wordpressのajax経路を使わないと駄目なのでしょうか?もしそうならば、わかりやすいサンプルが欲しいのですがご存知でしょうか?
guest

回答1

0

私のローカル環境で、下記のようにファイルを作成し確認致しましたが、ドラッグ&ドロップでも正常にレスポンスが返ってきています。
ご自身の環境でもお試し頂けますでしょうか。

  • htmlファイルで読み込んでいる、スクリプトファイルはご自身でご用意ください。
  • up.jsは、kobe-colorさんが記載された、スクリプトを全てコピーし、imageFileUpload()関数内のurlのみ変更致しました。
  • ajaxで読み込むphpファイル内で、var_dump($_FILES); などと記載し出力すれば、Firefoxのfirebugで、コンソールからレスポンスを確認できると思います。

[index.html]

<!DOCTYPE html> <html> <head> <title>test</title> <script src="js/jquery-1.11.0.min.js"></script> <script src="js/up.js"></script> </head> <body> <form action="" method="post"> <input id="file-image" type="file" name="file"> <div id="drop-zone" style="height: 100px;">ドラッグ&ドロップ</div> <img id="image" alt=""> いろいろ<input>や<textarea>など住所録のようなフォーム</textarea> <input type="submit"> </form> </body> </html>

[up.js]

window.onload=function() { var print_img_id = 'print_img'; var print_DataURL_id = 'print_DataURL'; if (checkFileApi()){ var file_image = document.getElementById('file-image'); //ファイル選択 file_image.addEventListener('change', selectReadfile, false); var dropZone = document.getElementById('drop-zone'); //ドラッグオンドロップ dropZone.addEventListener('dragover', handleDragOver, false); dropZone.addEventListener('drop', handleDragDropFile, false); } function checkFileApi() { // FileAPIに対応しているか // Check for the various File API support. if (window.File && window.FileReader && window.FileList && window.Blob) { return true; // Great success! All the File APIs are supported. } alert('The File APIs are not fully supported in this browser.'); return false; } function selectReadfile(e) { //ファイルが選択されたら読み込む var file = e.target.files; var reader = new FileReader(); //dataURL形式でファイルを読み込む reader.readAsDataURL(file[0]); //ファイルの読込が終了した時の処理 reader.onload = function(){ readImage(reader, print_img_id, print_DataURL_id); } } function handleDragOver(e) { //ドラッグ&ドロップ e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy. } function handleDragDropFile(e) { e.stopPropagation(); e.preventDefault(); var files = e.dataTransfer.files; // FileList object. var file = files[0]; var reader = new FileReader(); reader.readAsDataURL(file); //dataURL形式でファイルを読み込む reader.onload = function(){ //ファイルの読込が終了した時の処理 readImage(reader, print_img_id, print_DataURL_id); //処理(1) imageFileUpload(files[0]); //処理(2) } } //ファイルの読込が終了した時の処理(1)HTML書き出し function readImage(reader, print_image_id, print_DataURL_id ){ //ファイル読み取り後の処理 var result_DataURL = reader.result; var img = document.getElementById('image'); //読み込んだ画像とdataURLを書き出す var src = document.createAttribute('src'); src.value = result_DataURL; img.setAttributeNode(src); } //ファイルの読込が終了した時の処理(2)ファイルをアップロード function imageFileUpload(f){ var formData =new FormData(); formData.append('image', f); $.ajax({ type:'POST', contentType:false, processData:false, url:'uploads.php', data:formData, dataType:'json', success:function(data){ //何かする。デバッグしたいがalert出力できない。??? }, error:function(data){ //何かする } }); } }

[uploads.php]

<?php var_dump($_FILES);

投稿2016/09/06 04:46

xxxteruxxx

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問