ajax風に画像のアップロードをする
ajaxでフォームの送信をしているんですが、
その際、画像を送る必要があって
そういえばajaxって画像送れるん?
と思って調べてみた。
調べた結果、ajaxで送るのではなく
iframeをつかってajaxっぽくすることはできるみたいです。
ちょっと作ったので載せておきます。
main.html
<span id="pict" class="btn">pict</span> <form id = "ajaxSubmit"> <input type="hidden" id="imgHiddenUrl" value="" /> </form> <div id="imgPost"> <form id="uploadForm" action="imagePost" method="post" enctype="multipart/form-data" target="ajaxPostImage"> <input type="file" id="fileSelect" name="imageFile" /> <input type="reset" id="reset" /> </form> </div> <iframe name="ajaxPostImage" width="200" height="70"></iframe>
まず、画像を送信するメインhtmlです。
id#pictをクリックしたら、
画像を選択→画像を送る→(サーバサイドで画像を保存する)→iframeに表示させる→画像のurl情報をhiddenに持たせる
という流れです。
form#uploadForm のtargetの部分をiframeに指定しているところがポイント。
サーバサイドが出力したhtmlをiframeの中に入れる感じになる
div#imgPost の部分は、見えなくします。
iframe.html
<body> <div id="imgFileUrl">imgUrl</div> <div><html:img src="画像url" width="50" height="50" /></div> <div id="deleteImg">削除</div> </body> </html>
画像を実際に表示するiframeのhtml。
削除ボタンで画像の削除もできるようにしておきます。
$(function(){ var $pict = $("#pict"), $imgSelect = $("#fileSelect"), $imgForm = $("#uploadForm"), $iframe = $('iframe[name="ajaxPostImage"]'); $pict.click(function(){ $imgSelect.click(); return false; }); //fileのvalueが変わったら、データを送る $imgSelect.change(function(){ $imgForm.submit(); $iframe.show(); $pict.attr("class", "btn btn-warning"); }); $imgForm.submit(function(){ // submitされた時点で、loadイベントをbind $iframe.unbind().bind('load', function() { var response = $iframe.contents(); //iframeの中のurl情報を取得してhiddenに格納 var imgUrl = response.find('#imgFileUrl').text(); $("#imgHiddenUrl").val(imgUrl); deleteImg(); }); }); }); //画像削除 function deleteImg(){ var $iframe = $('iframe[name="ajaxPostImage"]'), response = $iframe.contents(), $deleteimg = response.find("#deleteImg"), $pict = $("#pict"), $deleteimg.bind("click", function(){ $.ajax({ type:"POST", url:"サーバサイドurl", data:{ "deleteurl":$("#imgHiddenUrl").val() }, dataType:"html", success: function(data,dataType){ $iframe.hide(); $pict.attr("class", "btn"); $("#imgHiddenUrl").val(""); $("#reset").click(); }, error: function(){ alert("問題が発生しました"); } }); }); }
画像データを送った後に、hidden要素に画像のurl情報を付けることによって、ほかの値と一緒にajax送信できるという仕組みです。
また、削除ボタンをクリックしたら、fileのvalueをresetボタンをクリックすることによって削除します。
なお、cssにbootstrapを使っています
参考url:
http://blog.joyfullife.jp/archives/2007/07/18115458.php
http://havelog.ayumusato.com/develop/javascript/e171-ajax-file-upload.html