■応用の森 dropzone.jsを使用した、Ajaxでのファイルアップロードサンプル 解説 |
今回は、前にご紹介した、File APIではない、フィルアップロードツールとしては世間で最もポピュラーと思われる dropzone.jsを使ったAjaxによるファイルのアップロード処理のサンプルプログラムの紹介です。 dropzone.jsの公式サイトは英語版しかなく 色々なサイトを参考に、読み解くのになかなか苦労しましたが、なんとか自分の要求にみあったものができたので 公開してみることにしました。 大まかな制御としては、Dropzoneのエリアを作成し、ドロップされたファイル情報を FormDataにセットして、Ajaxでサーブレットに送信します。 サーブレットは、受け取ったファイルをBase64エンコードして、そのままブラウザに返却し、 結果の画像をブラウザに表示します。 |
それでは、簡単にプログラムの解説です。 |
1)コントローラ |
src/main/java/jp/dip/arimodoki/cntl/Dropzone.java ・dzfileuploadview() メソッド アップロード用初期画面(dzuploadview.html)を表示するだけのハンドラメソッドです。 ・dzfileupload() メソッド Viewの「アップロード」ボタンがクリックされたときに実行されるメソッドです。 Viewから送信された複数ファイル情報をFormFile Beanで受け取り、 Base64エンコードしたものを、そのままView(dropresult.html)に返却します。 Base64エンコード形式の画像表示方法については、 【HTML編 No002:Base64形式の画像データ(jpeg/gif/png)を表示する方法】 で解説していますので、こちらも参考にしてみてください。 |
データを受け取るフォームBeanクラスです。 src/main/java/jp/dip/arimodoki/model/FormFile.java Viewから送信された画像ファイル情報の配列(uploadfile)と、各画像のMIME(imgtype)のプロパティと 受け取った画像をBase64変換してViewに返却するための結果情報(respImage)プロパティを持つフォームBeanです。 インターフェース FormFileIf.java は、Eclipseの「インターフェース抽出」で自動生成します。 |
|
2)View(HTML) |
まず、アップロード画面のHTMLです。 WebContent/dzuploadview.html HTML部は非常に単純なので説明の必要もないかもしれませんが、 <div id="div_alert"> の部分は、Ajaxがエラーを起こしたりした場合のアラート表示エリアです。 <div class="dropzone" id="fileupload"> の部分が今回の心臓部。ファイルのドロップ領域です。 <button id="id_upload"...> の部分は、ファイルのアップロードを実行するボタンです。 <div id="result> の部分は、送信された画像の処理結果を表示する領域です。 JavaScript部に、dropzoneや、Ajaxの処理が記述されていませんが、 今回はこれらをライブラリ化して、外部javaScriptファイルに追い出しています。 mydropzone.js、myutil.js がその実態ですが説明は後ほど。 |
話の関係上、結果Viewを先に説明します。 WebContent/dropresult.html サーブレットから返却された、Base64形式の画像情報文字列の配列を Thymeleafの、th:eachを使って、<img>タグに書き出しています。 Ajaxの処理結果として、結果表示エリア(<div id="result>)に描画されます。 |
dropzone用スタイルシートです。 dropzoneは、スタイルシートでデザインを装飾しないと、あまり見栄えのよい動作を実現できません。 ある意味、かなり重要なファクターです。 色々なサイトや、経験を参考にして自分なりのスタイルシートを用意してみました。 WebContent/css/mydropzone.css ひとつひとつ説明するのが困難なので、詳しい内容の説明は割愛します。(使いたい場合は、そっとそのまま使ってください) |
さて、やっと出現しました。dropzone処理の心臓部。外部ファイルでライブラリ化しています。 WebContent/js/myutil/mydropzone.js dropzoneの初期化処理、イベントハンドラの設定、各種プロパティの設定を行い 登録されたイベントハンドラの処理を実装しています。 先頭にある FileTypesは、送信可能なファイルタイプをフィルターするためのテーブルです。 myDropzone()のパラメータで、filetype:FileTypes.image のように指定すると、 画像タイプのファイルだけが送信可能となります。 詳しい内容はソースのコメントを読んでください。 ちなみに、ファイルタイプの正規表現チェックで、 underscore.jsが必要です。 |
Ajax処理ライブラリ。 WebContent/js/myutil/myutil.js jQueryのAjax処理は、毎回だいたい同じ処理を記述するので Ajax実行部を外部ライブラリ化しました。 これまで随所でさんざんご紹介しているので、詳し処理内容はソースのコメントを読んで各自解析してみてください。 |
Dropzoneサンプル ![]() |
dropzone.jsを使用した、Ajaxでのファイルアップロードサンプル 解説 |