JavaScriptでFile Read/Writeをやってみた

前回の続き。以下を参考にして、JavaScriptからFile Read/Writeを行いました。

FileSystem API について知る

 

作成したソースはGithubにアップロードしました。index.htmlを開き、saveボタンを押下するとテキストの内容を保存、loadにてテキストの内容を読み込みます。

# 動作確認は Chrome バージョン 31.0.1650.63 mで実施

以下、各処理のまとめ。

requestQuotaでストレージ クオータを要求する

JavaScriptからデータ保存するための許可を取得します。FileSystem API について知るで使用されている「window.webkitStorageInfo」は非推奨のようなので、こちらを参照して「navigator.webkitPersistentStorage」に置き換えました。

■「window.webkitStorageInfo」を使用した時に表示されるメッセージ

window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead. 

またローカルでhtmlファイルを動かして「navigator.webkitPersistentStorage」を実行すると実行できず、コンソールで以下のメッセージが表示されます。

message: "The implementation did not support the requested type of object or operation."

name: "NotSupportedError"

 xamppでApacheを起動し、Apache上で動かすことで動きました。(ここが一番詰まった。。)

ここまでのソースファイル
window.requestFileSystem  = window.requestFileSystem || window.webkitRequestFileSystem;

function onError () { console.log ('Error : ', arguments); }

navigator.webkitPersistentStorage.requestQuota (1024*1024*1024, function(grantedBytes) {
  console.log ('requestQuota: ', arguments);
  requestFS(grantedBytes);
}, onError);

function requestFS(grantedBytes) {
  window.webkitRequestFileSystem(window.PERSISTENT, grantedBytes, function(fs) {
    console.log ('fs: ', arguments); // I see this on Chrome 27 in Ubuntu
  }, onError);
}

 ファイルを作成する

window.webkitRequestFileSystemのコールバックからgetFileを実行して'log.txt'を作成する。

requestFS以下を変更する。

function requestFS(grantedBytes) {
  window.webkitRequestFileSystem(window.PERSISTENT, grantedBytes, onInitFs, onError);
}

function onInitFs(fs) {
  // getFile の第2引数で「create: true」を付けるとファイルを新規作成する。
  fs.root.getFile('log.txt', {create: true, exclusive: true}, function(fileEntry) {
    console.log(fileEntry.isFile); // true
    console.log(fileEntry.name); // log.txt 
    console.log(fileEntry.fullPath); // /log.txt 
  }, onError);
}

 ファイルを読み込む

getFileを以下のように変更する。

  fs.root.getFile('log.txt', {}, function(fileEntry) {

    // Get a File object representing the file,
    // then use FileReader to read its contents.
    fileEntry.file(function(file) {
       console.log(file);
       var reader = new FileReader();

       reader.onloadend = function(e) {
         var txtArea = document.createElement('textarea');
         txtArea.value = this.result;
         document.body.appendChild(txtArea);
       };
       reader.readAsText(file);
    }, onError);

  }, onError);

処理の流れは

  1. getFileでlog.txt を取得する
  2. fileEntry.fileでlog.txtを読み込むためのFileReaderを生成し、readAsTextで読み込む
  3. onloadendで、読み込んだ内容をtextareaに反映する。

となっています。log.txt が空の時は何も作成されません。

ファイルに書き込む

getFileを以下のように変更する。 BlobBUilder, window.WebKitBlobBuilderは使えないため、Blobを直接使う。

  fs.root.getFile('log.txt', {create: true}, function(fileEntry) {

    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function(fileWriter) {

      fileWriter.onwriteend = function(e) {
        console.log('Write completed.');
      };

      fileWriter.onerror = function(e) {
        console.log('Write failed: ' + e.toString());
      };

      // Create a new Blob and write it to log.txt.
      var bb = new Blob(['Lorem Ipsum']);
      fileWriter.write(bb);
    }, onError);
  }, onError);

ファイルを削除する

getFileを以下のように変更する。 削除が完了すると、'File removed'を出力する。

  fs.root.getFile('log.txt', {create: false}, function(fileEntry) {

    fileEntry.remove(function() {
      console.log('File removed.');
    }, onError);
  }, onError);

ここまでで、File Read/Write ができるようになりました(作成したソース)。