このエントリーをはてなブックマークに追加

File APIの一部で、大きなデータを扱う仕組み

Base64されたDataURLだと、大きすぎて、タグの属性のやり取りで時間かかる。 ArrayBufferのままだと、渡す仕組みがない。

例えば、動画ファイルをアップロードした場合、それがBlobになる。 そして、BlobのURLを取り出す仕組みを使うと、videoタグにBlob-URLを渡して再生できる。

あるいは、JavaScript中でZipファイルを作成して、それをBlobにすれば、リンクからダウンロードできるようにも出来る。

パソコン内に大きなデーターを保存できるFileSystem API(Chromeのみ対応)もBlob経由で行う。

IndexedDBも新しいのはBlobに対応して、バイナリーデーターを保存可能になった。

FileEntryも多少似てるけど、こちらは、ファイル名とかパスとかがあり、原則、ユーザーが作成できない。ファイルをアップロードしたり、FileSystemに保存されたデーターを読み込むことで作成される。

注意事項

Chromeの場合500MBほどのサイズを超えると、正常に動作しない。 https://code.google.com/p/chromium/issues/detail?id=375297

Blobを作成しても、グローバルに置かないと、ガーベージコレクションに回収されて消える。

グローバルなBlobを消すには、nullを代入と、revokeObjectURL()の2つ必要かもしれない。

BlobのURLの作成の仕方

window.webkitURL || window.URL から createObjectURL(blob)

Blobの作成の仕方

テキストからBlob作成

new Blob([text],{type:"text/plain;charset=UTF-8"});

arraybufferやuint8arrayからBlob作成

new Blob(array);

base64uri:canvas.toDaraURL()から

var BASE64_MARKER = ';base64,';
      var index=dataURI.indexOf(BASE64_MARKER);
      var base64Index=0;
      if(index!=-1){
           base64Index=index  + BASE64_MARKER.length
      }
      var base64 = dataURI.substring(base64Index);
      var raw = atob(base64);
      var rawLength = raw.length;
      var uInt8Array = new Uint8Array(rawLength);

      for (var i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
      }
 new Blob([uInt8Array],{type:type});

アップロードしたファイルから

filesはblobの配列といっていい。

ファイルアップロードの場合

event.target.files

ファイルをドロップした場合

event.dataTransfer.files

JSZipから

typeにblobがあるので、APIを参照

jszip.generate(type:"blob")