ファイルアップロード機能を実装したい - ng-file-upload
ng-file-uploadを利用することで、ドラッグ&ドロップ対応のファイルアップローダーをごくシンプルなコードで実装できます。あらかじめ用意した領域にファイルをドロップすることで、自動的にアップロード処理が実施されます。ドラッグ&ドロップ機能に対応していないブラウザーでは、ドロップ領域をクリックすることで、ファイル選択ボックスからアップロードファイルを選択することもできます。
ng-file-uploadは、Bowerを利用することで、以下のコマンドでインストールできます。
bower install --save ng-file-upload
では、基本的なアップロード機能を実装してみましょう。
<!--(1)ng-file-uploaderの動作に必要なライブラリをインポート--> <link rel="stylesheet" href="css/upload.css" /> <script src="bower_components/angular/angular.min.js"></script> <script src="bower_components/ng-file-upload/ng-file-upload-shim.min.js"></script> <script src="bower_components/ng-file-upload/ng-file-upload.min.js"></script> <script src="scripts/upload.js"></script> ...中略... <form> <!--(3)アップロード領域を準備--> <div ngf-drop ngf-select ng-model="files" ngf-multiple="true" ngf-allow-dir="false" ngf-accept="'.jpg,.png,.gif'" class="drop" ngf-drag-over-class="dragover"> ここにファイルをドロップ、またはクリックしてください。 </div> </form>
// (2)ui.bootstrapモジュールへの依存関係を宣言
angular.module('myApp', ['ngFileUpload'])
.controller('MyController', ['$scope', 'Upload', function ($scope, Upload) {
// (4)ファイル選択時にアップロード処理を実行
$scope.$watch('files', function () {
var fs = $scope.files;
// ファイルが一つ以上指定されている場合に…
if (fs && fs.length) {
// 先頭のファイルから順にアップロードを実行
for (var i = 0; i < fs.length; i++) {
var f = fs[i];
// アップロードの実処理
Upload.upload({
url: 'upload.php',
file: f
})
// (5)アップロード成功時にログ表示
.success(function (data, status, headers, config) {
console.log(config.file.name + ' success!!'));
});
}
}
});
}]);
ng-file-uploadを利用するにはライブラリ本体(ng-file-upload-shim.min.js/ng-file-upload.min.js)をインポートした上で(1)、アプリモジュール(myApp)からngFileUploadモジュールへの依存関係を宣言します(2)。
アップロードファイルをドラッグ&ドロップするための領域を定義するのは、ngf-drop属性(ディレクティブ)です(3)。また、領域クリックでファイル選択ボックスを起動できるように、ngf-select属性(ディレクティブ)も併記しておきます。ドラッグ&ドロップ機能だけで良いならばngf-select属性は不要ですし、ドラッグ&ドロップ機能が不要であればngf-drop属性は不要です。
そのほか、ngf-drop/ngf-selectディレクティブに付随する属性には、以下のようなものがあります。
| 属性 | 概要 |
|---|---|
| ng-model | アップロードファイルをバインドする変数 |
| ngf-drag-over-class | ドラッグしたファイルを領域に乗せた時に適用するスタイル |
| ngf-multiple | 複数ファイルを選択できるようにするか(デフォルトはfalse) |
| ngf-accept | アップロード可能なファイル形式(例:「image/*」。カンマ区切り) |
| ngf-max-size | アップロード可能な最大ファイルサイズ(バイト単位) |
| ngf-allow-dir | フォルダーをアップロード可能にするか(WebKit系ブラウザーのみ) |
選択したファイルはng-model属性で指定した変数filesに反映されますので、$scope.$watchメソッドでこれを監視して、ファイルが選択されたタイミングでアップロード処理を実行します(4)。アップロードを実行するには、Uploadサービスのuploadメソッドを呼び出します。uploadメソッドは、引数として、以下のようなパラメーターを受け取ります。
| パラメーター名 | 概要 |
|---|---|
| url | アップロード先のパス |
| file | アップロードするファイル |
| fileName | ファイル名 |
| method | アップロードで利用するHTTPメソッド(デフォルトはPOST) |
urlパラメーターで指定したファイル(ここではupload.php)で、サーバーへの保存処理を実装します。サーバー側の処理は本稿の守備範囲外なので、詳しくは配布サンプルのコードを参照してください。
アップロードに成功した場合の処理は、successメソッドのコールバック関数として指定します(5)。コールバック関数は、引数として、
- レスポンス本体(data)
- ステータスコード(status)
- 応答ヘッダー(headers)
- リクエスト時の設定情報(config)
を受け取りますので、ここではconfig.file.nameでアップロードファイルの名前を取得/ログ出力しています。
まとめ
以上、本稿では入力生産性を効率化するためのライブラリとして、UI Bootstrap(Typeahead)とng-file-uploadについて解説しました。特に、UI Bootstrapは、Typeaheadのほかにも、さまざまに定番ウィジェットを提供する高機能なライブラリです。本連載でも、主なものを引き続き紹介していく予定です。
次回は、引き続きスライダー、レーティングバー、カラーピッカーなど、入力フォームを利用しやすくするためのライブラリを紹介する予定です。
参考資料
- 『AngularJSアプリケーションプログラミング』(技術評論社)
- 『AngularJSライブラリ 活用レシピ 厳選 108』(WINGSプロジェクト)
