ドロップでファイルを受け取れるようになったのですが
ファイルオブジェクト、Blob オブジェクトを所持している状態で
そのファイルを type="file" と同じ形式で送信するにはどうすればいいのでしょうか
最初に hidden_field をうめこんで form.submit を呼ぼうとしましたが
file オブジェクトをどういう形式で埋め込んでいいのかわからず
次に form データにうめこんで贈ろうとしたんですが
$.ajax ではなく通常送信を行う方法がわかりません
サーバーサイドが Rails で carrierwave というジェムを使っていて
file_field と同じ形式でとんできてくれないとファイルが保存できないので
ファイルの中身をバイナリ文字列として埋め込んで送信するという方法も使えません
何かいい方法があればお知恵をおかしいただけないでしょうか
<html lang="ja"> <style> .drop-upload { border:2px dotted #0B85A1; color:#92AAB0; text-align: left; vertical-align: middle; padding:10px; margin: 10px; } .drop-upload input { display: none; } </style> <body> <form> <div class="drop-upload">ファイルをドロップまたはクリックして選択してください <input name="image" type="file"> <div class="preview"></div> </div> <input type="submit"> </form> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script> let drop_file = null; $('.drop-upload').on('drop', (e) => { e.preventDefault(); // ドロップファイルを記憶 drop_file = e.originalEvent.dataTransfer.files[0]; // プレビュー const reader = new FileReader(); $image_item = $(e.target).find('.preview'); reader.onload = (e) => { $image_item.html($('<img>').attr('src', e.target.result)); } reader.readAsDataURL(drop_file); }); // ドロップフォーム以外にドロップされたときページが画像になるのを防ぐ $(document).on('drop', (e) => { e.stopPropagation(); e.preventDefault(); }); $(document).on('dragenter', (e) => { e.stopPropagation(); e.preventDefault(); }); $(document).on('dragover', (e) => { e.stopPropagation(); e.preventDefault(); }); // 送信ボタンがおされたとき $('form').on('submit', (e) => { console.log(drop_file); // file オブジェクト try { const form_data = new FormData( $(e.target).get()[0] ); // ファイルが選択されてなかったらドロップファイルを送信 if(!$('[type="file"]').val()) { // $(e.target).append($('<input type="hidden" name="image">').val(drop_file)); // とかいても value が "[object File]" という文字になる form_data.append($(e).attr('name'), drop_file); } // ここでform_data を submit したい } catch(e) {} return false; }); </script> </body> </html>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/08 08:17