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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

Q&A

解決済

2回答

1618閲覧

ドラッグで受け取ったファイルを type="file" と同じ形式で送信したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

0グッド

0クリップ

投稿2019/04/08 07:54

ドロップでファイルを受け取れるようになったのですが
ファイルオブジェクト、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>

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

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

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

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

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

guest

回答2

0

ベストアンサー

ドロップでファイルを受け取れるようになったのですが

ファイルオブジェクト、Blob オブジェクトを所持している状態で
そのファイルを type="file" と同じ形式で送信するにはどうすればいいのでしょうか

<input type="file">を作って、そのfilesを書き換えることで可能です(StackOverflow)。

投稿2019/04/08 07:58

maisumakun

総合スコア145932

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

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

退会済みユーザー

退会済みユーザー

2019/04/08 08:17

drop されたときに $(e.target).find('[type="file"]').get()[0].files = e.originalEvent.dataTransfer.files; とかくだけで ActionDispatch が飛んでくるようになりました もっと大変かと思ってたんですがsubmit 時に処理する必要もなくなってこんな簡単にできるのですね 大変助かりました 本当にありがとうございました!
guest

0

javascript

1<style> 2#droppable { 3border: gray solid 1em; 4display: block; 5padding: 2px 1em; 6position: relative; 7height:100px; 8} 9#droppable input[type="file"] { 10background-Color:red; 11height: 100%; 12left: 0px; 13top: 0px; 14position: absolute; 15width: 100%; 16opacity: 0; 17} 18</style> 19<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 20<script> 21$(function(){ 22 $('input:file').on('drop',function(){ 23 $(this).closest('form').trigger('submit'); 24 }); 25}); 26</script> 27<form method="post" action="y.php" enctype="multipart/form-data"> 28<div id="droppable"><div>ドロップして</div> 29<input type="file" name="userfile"> 30</div> 31<input type="submit"> 32</form>

投稿2019/04/08 08:43

yambejp

総合スコア116466

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問