Webアプリを作成してます。
現在機能として新規にデータを登録する画面を作成しています。お店の情報を登録するような画面です。
- お店の名前や連絡先などを<input type="text">で入力
- 画像ファイルもアップロードしたい(枚数は決めず何枚でもユーザーの操作で追加出来る)
ここで、この画像ファイルですが、
<input type="file">で選ばせるのではなく、ブラウザにファイルをドラッグすることで登録できようにしようと思い、
最速・最高のファイルアップロードに近づくための1歩
https://qiita.com/zaru/items/8c0ab5c70775644d4d41
こちらを参考に実装しました。
(「ドロップ」というところの実装方法です)
こちらの方法で、画面上にドラッグした画像ファイルを表示させ、JQueryでformDataに画像データをもたせる事までは出来ました。
(該当箇所は下記のような内容です)
javascript
1 for (var i = 0; i < files.length; i++) { 2 (function() { 3 var fr = new FileReader(); 4 fr.onload = function() { 5 var div = document.createElement('div'); 6 7 var img = document.createElement('img'); 8 img.setAttribute('src', fr.result); 9 div.appendChild(img); 10 11 var preview = document.getElementById("preview"); 12 preview.appendChild(div); 13 }; 14 fr.readAsDataURL(files[i]); 15 })(); 16 17 formData.append("file", files[i]); 18 }
しかし、ここからどうやってPOSTさせるのかが分からずに悩んでいます。
同じく参考サイトに乗っていたPOST部分の処理が
javascript
1var postButton = document.getElementById("post"); 2postButton.addEventListener("click", function() { 3 var request = new XMLHttpRequest(); 4 request.open("POST", "POST_URL"); 5 request.send(formData);
とありましたが、この内容では非同期でPOST通信を投げるだけのようで、画面遷移が伴わない内容でした。
通常のsubmitボタンを押下した際のような、画面遷移を伴うPOST通信をこの方法で実現するにはどうすれば良いでしょうか。
現在、参考サイトの方法を少しいじり、既存の<form>の内容を取得するように、以下の様にFormDataオブジェクトを生成しています。
** この内容で非同期でのPOST通信ですが、希望している「お店の名前や連絡先」と「追加した画像データ」がPOSTされているのは確認出来ています。**
javascript
1var formElement = document.querySelector("form"); 2 var formData = new FormData(formElement);
当初、<input type="file">に動的に画像データを追加して普通にsubmitボタンを押下させれば良いかと思ったのですが、Javascriptから<input type="file">にデータの設定などが出来ない仕様のようでした。
ですので、「元のformに画像を追加して普通にsubmit」が出来ないと判断し、「JSで元のformの内容を読込、さらにそこに画像ファイルを読み込んで追加していき、Javascriptでsubmitを実現」の方法しかないと判断しました。
私の要件を実現出来る方法を御存知でしたら教えてください。
宜しくお願いします。
追記
今回POSTして完了ではなく、通常のsubmit(POST通信)と同様の動きを希望しております。
サーバー側でPOSTされた内容から、確認画面用のHTMLを組み立ててレスポンスとして返し、確認画面を表示する、という流れを希望しておりました。
入力値はhidden値として確認画面で持ち回るつもりですが、画像についてはどうしたものか合わせて悩んでおりました。
最初のPOST時にサーバー側で一時ファイルとしてどこかに格納して、確認画面ではそれを表示などを検討しておりました。
ですので今回希望している動きはこの確認画面へPOSTと同時に遷移(サーバーからのレスポンスでHTMLを受け取って表示)という動きを希望しておりましたので、補足として追記いたします。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/08 11:38
2018/04/08 13:11