SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Apache Cordovaで本格スマホアプリに挑戦しよう

ファイルを操作するためのプラグインで、テキストや画像をアプリ内に保存する

Apache Cordovaで本格スマホアプリに挑戦しよう 第6回

画像ファイルの保存と表示

 続いて、画像ファイルの保存と表示を行います。画像ファイルの保存と言っても基本的にはテキストの場合と同様でリスト8のようになります。今回保存する画像パスは先ほど紹介したcdvfileプロトコルを使って指定しています。

リスト8 画像データの保存(app/www/js/controllers/FileImageController.jsの抜粋)
var file_element = $('#file')[0];
var file = file_element.files[0];
if(file) {

  $scope.filename = file.name;

  //(1)ファイルを参照するためのFileReaderを作成
  var reader = new FileReader();
  //(2)ファイルの読み込みが終了したタイミングでファイルに保存する
  reader.onloadend = function(evt){
    window.resolveLocalFileSystemURL(
      "cdvfile://localhost/cache/", //(3)cdvfileプロトコルの利用
      function(dir) {
        dir.getFile($scope.filename, {create: true}, function(entry) {
          entry.createWriter(function(writer) {
            //(4)ファイルの書き込み
            writer.write(reader.result);
          });
        });
      }
    );
  };
  //(5)ファイルをArrayBufferとして読みこむ
  reader.readAsArrayBuffer(file);
}

 画像ファイルを読みこむ処理は、CordovaのプラグインAPIではなく、ブラウザのAPIを使っていますのでWebアプリなどで処理を記述する場合と同じです。

 最初に、(1)FileReader作成し、ファイルの読込が終了したタイミングであるonloadendハンドラ(2)で、これまでと同様にファイルを保存します。

 今回はcdvfileプロトコルを使っていますので、(3)のようにcdvfileプロトコルでのURL形式で指定しています。実際のファイルの書き込み処理(4)は今までと全く同様です。

 (5)ファイルの読み込みではArrayBufferとしてファイルを読みこむ必要があります。この部分がテキストと異なります。reader.resultもテキストの場合とはことなり、ArrayBuffer形式ですが、それらの違いにかかわらず、ファイルの書き込み処理に違いはありません。

 また、AngularJSではHTMLの要素を処理する処理はコントローラで記述することは推奨されていません。本来であれば、ディレクティブなどを別途作成する方が望ましいですが、処理の簡略化と説明の都合のためコントローラ内に記述しています。

 続いて、画像ファイルを表示します。cdvfileプロトコルを使えばHTMLのIMGタグに保存したパスを指定する事で可能で、使用するHTMLテンプレートがリスト9のようになります。cdvfileプロトコルを使わなくてもJavaScriptでData URL形式などを使えば可能ですが、cdvfileプロトコルを使うよりも何倍も手間がかかります。

 AngularJSではng-srcに画像パスを設定すると自動的にsrcタグに同じパスが設定されますので、img_pathという変数に実際のパスを設定すれば自動的に画像が表示されます。

リスト9 画像表示をするHTML(app/www/views/file_image.htmlの抜粋)
<img id="img_path" ng-src="{{img_path}}" width="100%">

 画像を表示する際に実行する処理がリスト10になります。参考までにjQueryでの設定方法も示します。

リスト10 IMGタグへの画像パスの設定(app/www/js/controllers/FileImageController.jsの抜粋)
$scope.img_path = "cdvfile://localhost/cache/" + $scope.filename;
// $('#img_path').attr('src',"cdvfile://localhost/cache/" + $scope.filename); と同様

 また、AngularJS独自の制限になりますが、URLなどをIMG要素のsrc属性に指定する場合には、あらかじめ指定したプロトコル以外では自動的にサニタイズ処理が行われてしまい、正常に表示されないという問題が発生します。そのために、モジュールを作成する箇所にて、リスト11のような記述の追加が必要です。

リスト11 AngularJSでのHTMLテンプレートへcdvfileプロトコルを使ったパスを指定する設定(app/www/js/main.jsの抜粋)
var module = angular.module('main',[]);
// (省略)
module.config(function($compileProvider) {
    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|cdvfile):/);
}

最後に

 前回と今回でファイルプラグインを紹介しました。アプリ内のファイルを扱えることは、オフライン対応などを行う上で必須となる機能です。実際にはネットワークからダウンロードしたファイルを扱ったり、ローカルのファイルをネットワークへとアップロードしたりするなど、その他のプラグインと連携して利用するケースが多いと思います。また、スマホで撮った写真、映像などと連携したアプリを作る際にも必要になる事でしょう。本格的なアプリを作成する上でファイル関連操作は必ず必要となる機能ですので、ぜひ使い方を覚えてアプリ作成に役立てていただけると幸いです。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Apache Cordovaで本格スマホアプリに挑戦しよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9527 2016/07/13 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー