Blobを用いて分割読み込みする
目次
概要
- Blob は Binary Large OBject の略です。
- JavaScript の Blob は HTML5 関連仕様である File API で定義されています。
- File API によるファイル読み込みや、fetch() によるサーバから非同期通信で、データを読み出す際に利用されます。
- File API の File クラスは Blob のサブクラスとして実装されています。
- slice() を用いることにより、巨大なファイルや、巨大なデータ通信を、分割して逐次読み込みすることが可能です。
ファイルを一括読み込みするサンプル
File API を用いてファイルを一括読み込みする例を下記に示します。読み込んだファイルの内容は開発ツールのコンソールに表示されます。
HTML
<div>
<input type="file" id="file1">
<button id="btn1">OK</button>
</div>
<script>
document.getElementById("btn1").addEventListener("click", function(e) {
var files = document.getElementById("file1").files;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var reader = new FileReader();
reader.onload = function(e) {
console.log("------onload------");
console.log("state=" + e.target.readyState);
console.log("length=" + e.target.result.length);
console.log("data=" + e.target.result);
}
reader.onerror = function(e) {
console.log("error=" + e.target.error.name);
}
reader.readAsText(file, "utf-8");
}
});
</script>
表示
ファイルを分割読み込みするサンプル
slice() を用いることで、分割読み込みすることが可能となります。分割読み込みの際には、下記の様な関数を用意しておくと便利です。
JavaScript
function readBlobAsText(blob, size, callback) {
var offset = 0;
var reader = new FileReader();
reader.onload = function(e) {
callback(e.target.readyState, e.target.result);
if (offset < blob.size) {
slice = blob.slice(offset, offset + size, blob.type);
offset += size;
reader.readAsText(slice, "utf-8");
}
}
reader.onerror = function(e) {
console.log("error=" + e.target.error.name);
}
slice = blob.slice(offset, offset + size, blob.type);
offset += size;
reader.readAsText(slice, "utf-8");
}
上記を用いて、ファイルを 10バイトずつ分割読み込みする例を下記に示します。
HTML
<div>
<input type="file" id="file2">
<button id="btn2">OK</button>
</div>
<script>
document.getElementById("btn2").addEventListener("click", function(e) {
var files = document.getElementById("file2").files;
for (var i = 0; i < files.length; i++) {
readBlobAsText(files[i], 10, function(state, data) {
console.log("------onload------");
console.log("state=" + state);
console.log("length=" + data.length);
console.log("data=" + data);
});
}
});
</script>
表示
HTTPリソースを分割読み込みするサンプル
fetch() と Blob を組み合わせることで、http://~ や https://~ で始まるリモートのリソースを分割読み込みすることが可能です。
HTML
<input type="text" id="file3" value="https://www.tohoho-web.com/index.htm">
<button id="btn3">OK</button>
<script>
document.getElementById("btn3").addEventListener("click", function(e) {
var url = document.getElementById("file3").value;
window.fetch(url)
.then(function(response) {
return response.blob();
})
.then(function(blob) {
readBlobAsText(blob, 1024, function(state, data) {
console.log("------onread------");
console.log("state=" + state);
console.log("length=" + data.length);
console.log("data=" + data);
});
});
});
</script>
表示
Copyright (C) 2018 杜甫々
初版:2018年5月6日 最終更新:2018年5月6日
https://www.tohoho-web.com/how2/blob-slice.html