JavaScriptで扱うバイナリデータの形式
| バイナリデータの形式 | 説明 |
|---|---|
| arraybuffer | バイナリデータのバイト配列。 |
| File | <input type="file" />で取得できるオブジェクト。 ファイル名やファイルサイズなどが取得できる。ブラウザがバイナリデータを内部的に保持する。 |
| Blob | BlobはMySQLが扱うバイナリデータ形式。ブラウザがバイナリデータを内部的に保持する。 |
| base64 | 7bitしか扱えないような環境に適したバイナリデータ形式。 バイナリデータをAjaxで送受信するときに利用できる。 |
| Data URL Scheme |
バイナリデータをURL形式の文字列として扱う。URLの一種なのでimg要素やアンカー要素にセットできる。 小さめのバイナリデータ向きで、HTMLに直接記述可能。 |
| Blob URL Scheme | URLの一種なので、URLをセットできる要素で利用できる。 大きめのバイナリデータ向きだが、HTMLに直接記述は不可(プログラム中で動的に作成)。バイナリデータはブラウザが内部的に保持する。 |
| Uint8Array | arraybufferのデータを8ビット符号整数として読み書きできる。 |
| DataView | arraybufferを扱うオブジェクト。バイトオーダや符号を指定してデータを読み出すメソッドが用意されている。Uint8Arrayより遅い。 |
HTML
<input id="file1" type="file" name="file1" multiple />
JavaScript
//ファイルアップロードイベント
$('#file1').change(function(e) {
var files = e.target.files;
var oFile = files[0];
m_file_name = oFile.name;
var reader = new FileReader();
reader.readAsDataURL(oFile);
//ファイル読込成功イベント
reader.onload = function(e) {
// データURLスキームを取得
var data_url_scheme = reader.result;
// データURLスキームからbase64形式のバイナリデータに変換する
var base64 = btoa(data_url_scheme);
base64 = base64.replace(/^.*,/, '');
// URLエンコード
var file_name = encodeURIComponent(m_file_name);
$.ajax({
type: "POST",
url: "file_upload_base64.php",
data: 'base64=' + base64 + '&file_name=' + file_name,
cache: false,
dataType: "text",
success: function(res, type) {
$('#res').html(res);
},
error: function(xmlHttpRequest, textStatus, errorThrown){
console.log(xmlHttpRequest.responseText);
alert(textStatus);
}
});// ajax
}// reader.onload
});// $('#file1').change
PHP
$base64=$_POST['base64'];
$file_name=$_POST['file_name'];
$file_name = urldecode ($file_name);
$file_name = 'img/'.$file_name;
echo $file_name;
// BASE64バイナリ文字列をファイルに変換して書き出す
$base64 = base64_decode($base64);
$base64 = preg_replace("/data:[^,]+,/i","",$base64);
$base64 = base64_decode($base64);
file_put_contents($file_name, $base64);
html
<input id="file1" type="file" multiple /><br> <img id="img1" src=""/>
JavaScript
$( function() {
//ファイルアップロードイベント
$('#file1').change(function(e) {
//ファイルオブジェクト配列を取得(配列要素数は選択したファイル数を表す)
var files = e.target.files;
var oFile = files[0];
var reader = new FileReader();
reader.readAsDataURL(oFile); // データURLスキーム取得処理を非同期で開始する
// データURLスキームを取得後に実行される処理
reader.onload = function(evt) {
// img要素にデータURLスキームをセットし、画像表示する。
$('#img1').attr('src',reader.result);
}
});
});
Blob
arraybufferとコンテンツタイプ からBlobオブジェクトを生成することができる。javascript
function test1(){
var xhr = new XMLHttpRequest();
xhr.open('GET', 'smp1.png', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
// arrayBufferを取得する
var arrayBuffer = this.response;
// Blobを生成する
var blob = new Blob([arrayBuffer], {type: "image/png"});
console.log(blob);
// BlobをBlobURLスキームに変換して、img要素にセットする。
var blob_url = window.URL.createObjectURL(blob);
$('#img1').attr('src',blob_url);
};
xhr.send();
}
サンプル参考リンク
バイナリファイルをAjaxで取得する際に注意する点<img id="img1" src="" />JavaScript
var xhr = new XMLHttpRequest();
xhr.open('GET', fp, true);
xhr.responseType = 'blob';
xhr.onload = (e) => {
// Blobを取得する
var blob = e.target.response;
// BlobをBlobURLスキームに変換して、img要素にセットする。
var blob_url = window.URL.createObjectURL(blob);
$('#img1').attr('src',blob_url);
};
xhr.send();
var fp = "upload_files/imori.jpg";
var xhr = new XMLHttpRequest();
xhr.open('GET', fp, true);
xhr.responseType = 'blob';
xhr.onload = (e) => {
// Blobを取得する
var blob = e.target.response;
var mime_type = getResponseHeader("Content-Type");
var size = xhr.getResponseHeader("Content-Length");
var server = xhr.getResponseHeader("server");
var modified = xhr.getResponseHeader("Last-Modified");
var r_url = e.target.responseURL;
console.log(mime_type); // MIME
console.log(size); // サイズ(容量)
console.log(server); // サーバー情報
console.log(modified); // 更新日
console.log(r_url); // ファイル名を含むURL
// BlobをBlobURLスキームに変換して、img要素にセットする。
var blob_url = window.URL.createObjectURL(blob);
$('#img1').attr('src',blob_url);
};
xhr.send();
var fp = "upload_files/imori.jpg";
var xhr = new XMLHttpRequest();
xhr.open('GET', fp, true);
xhr.responseType = 'blob';
xhr.onload = (e) => {
// Blobを取得する
var blob = e.target.response;
// ヘッダー情報を出力
console.log(xhr.getAllResponseHeaders());
// BlobをBlobURLスキームに変換して、img要素にセットする。
var blob_url = window.URL.createObjectURL(blob);
$('#img1').attr('src',blob_url);
};
xhr.send();
date: Mon, 13 Aug 2018 01:06:23 GMT last-modified: Sat, 11 Aug 2018 14:02:29 GMT server: Apache/2.4.29 (Win32) OpenSSL/1.0.2n PHP/7.1.14 accept-ranges: bytes etag: "20e55-573294f9aa9f8" content-length: 134741 content-type: image/jpeg
<input id="file1" type="file" multiple />
$( function() {
//ファイルアップロードイベント
$('#file1').change(function(e) {
var files = e.target.files;
var oFile = files[0];
var reader = new FileReader();
reader.readAsDataURL(oFile);
//ファイル読込成功イベント
reader.onload = function(evt) {
// データURLスキーム形式のバイナリデータ
console.log(reader.result);
// base64形式のバイナリデータ
var base64 = btoa(reader.result);
console.log(base64);
}
});
});
バイナリデータの種類
取得できるバイナリデータの形式は、 データURLスキーム、 base64、blob、16進数バイナリデータなど。サーバーに依存せずにバイナリデータを扱える
ファイルアップロードによる画像表示を行う場合、従来の方法だと、一度サーバー側に画像をアップしてから画面表示するという流れになる。メリット
デメリット
データURLスキームの構造
data:[content-type];[charset],データ文字列
データURLスキームの例
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAMCAIAAAA7y9DJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA8SURBVChTY/hPCJCiQmmjDzKCisJVoElDEESKRBU7q8Lh0kAEkUJXgawIIoVwKRBAVEA5MDAAKrCA//8BTMVCj0IpR1QAAAAASUVORK5CYII=">上記のデータURLスキームによる画像→
base64
ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFNQ0FJQUFBQTd5OURKQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQUE4U1VSQlZDaFRZL2hQQ0pDaVFtbWpEektDaXNKVm9FbERFRVNLUkJVN3E4TGgwa0FFa1VKWGdhd0lJb1Z3S1JCQVZFQTVNREFBS3JDQS8vOEJUTVZDajBJcFIxUUFBQUFBU1VWT1JLNUNZSUk9データURLスキームはbase64と似るがデータ文字列は異なる。
$('#img1').attr('src',data_url);
<a id="a_dl" href="" download >ダウンロード</a><br>
$('#a_dl').attr('href',data_url);
JavaScript
Blobオブジェクトとして取り扱われる。応用
画像のBlobオブジェクトをBlob URL Schemeに変換して、Img要素のsrc属性にセットし、画像表示できる。参考リンク
javascript
// データソース。8bit数値配列形式のバイナリデータ。
var i8ary = new Uint8Array([137,80,78,71]);
var source = [ i8ary ];
// オプション情報。コンテンツタイプ(MIME)など。
var option = {
type: "application/octet-binary"
};
// blobを作成
var blob = new Blob( source , option );
blob:http%3A//localhost/6ce1fb2c-af5d-435a-b12a-6fb9fbe16f00
Blob URL Schemeの作成方法
Blob URL SchemeはBlobオブジェクトから「window.URL.createObjectURL」関数で作成できる。
function test1(){
var xhr = new XMLHttpRequest();
xhr.open('GET', 'smp1.png', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
var arrayBuffer = this.response;
// Blobを生成する
var blob = new Blob([arrayBuffer], {type: "image/png"});
console.log(blob);
// BlobをBlobURLスキームに変換して、img要素にセットする。
var blob_url = window.URL.createObjectURL(blob);
$('#img1').attr('src',blob_url);
};
xhr.send();
}
参考リンク
Blob URL Scheme とは?| Blob URL Scheme | Data URL Scheme |
|---|---|
| 大きめのデータ向け。 | 小さめのデータ向け。 |
| HTMLに直接、静的に書き込むことはできない。 | HTMLに直接、静的に書き込むことができる。 |
| データはブラウザが保持。 | データは、ただのテキストである。 |
| 100MBを超えるデータにも耐えられる。 | 小さい画像ファイルの代わりにData URL Schemeにすると、高速化できる。 |
参考リンク
Blob URL Scheme についてMIMEとは
電子メールの規格として考案された。MIMEの主なパラメータ
| パラメータ | 説明 |
|---|---|
| Content-Type | コンテンツタイプ。コンテンツの種類を表す。MIMEというとこちら示すほど重要である。 |
| Content-Transfer-Encoding | 符号方式。データを送信するときの変換方法である。7bit,8bit,binary,base64などがある。デフォルトは7bit。 |
| Content-Description | 任意で書いてよい説明文のようである。 |
| Content-Disposition | ファイル名を指定するようである。 |
Content-Type | コンテンツタイプ
| コンテンツタイプ | 説明 |
|---|---|
| text/plain | プレーンテキスト |
| text/html | HTMLテキスト |
| application/xhtml+xml | XHTMLテキスト |
| image/gif | GIF画像 |
| image/jpeg | JPEG画像 |
| image/png | PNG画像 |
| video/mpeg | MPEG動画 |
| application/octet-stream | 任意のバイナリデータ |
| application/pdf | PDF文書 |
| multipart/alternative | HTMLメールがHTMLとプレーンテキストに分けられるように、同じ情報を異なる形式で見れるようにする。 |
| application/x-www-form-urlencoded | HTTPのPOSTメソッドによるフォームデータの送信。 |
| multipart/form-data | ファイルアップロード(<input="file" />)のときに使われる。HTMLのform要素に指定される。 |
| x-○○ | x-で始まる独自の名称を使うことができる(例: application/x-gzip) |
MIMEのContent-Transfer-Encoding
| Content-Transfer-Encodingの値 | 説明 |
|---|---|
| 7bit | デフォルトはこれ。 |
| 8bit | あまり見かけず。特別なプロトコルが使うらしい。 |
| binary | あまり見かけず。特別なプロトコルが使うらしい。 |
| quoted-printable | あまり見かけず |
| base64 | よく見かける。バイナリデータを7bitのテキストとして扱う。 |
参考サイト
MIME の基礎javascript
function test1(){
// サーバー上の画像ファイルから、Ajaxを利用してバイトデータ(arraybuffer)を取得する
var xhr = new XMLHttpRequest();
xhr.open('GET', 'smp1.png', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
// 画像ファイルのバイトデータを取得する
var arrayBuffer = this.response;
// バイトデータとコンテンツタイプからBlobを生成する
var blob = new Blob([arrayBuffer], {type: "image/png"});
// ★FileReaderでBlobを読み取る
var reader = new FileReader();
reader.readAsDataURL(blob);
// Blob読込後のイベント
reader.onload = function(evt) {
// データURLスキームを取得する
var data_url = reader.result;
console.log(data_url);
// データURLスキームを画像表示させる。
$('#img1').attr('src',data_url);
// データURLスキームからbase64形式に変換してみる
var base64 = btoa(data_url);
console.log(base64);
}
};
xhr.send();
}
サンプル
function test1(){
var text1 = 'いろは';
var b64 = utf8_to_b64(text1);// utf8からbase64に変換する
var text2 = b64_to_utf8(b64);// base64からutf8に変換する
console.log(b64);
console.log(text2);
}
// utf8からbase64に変換する
function utf8_to_b64(str) {
return window.btoa( unescape(encodeURIComponent(str)));
}
// base64からutf8に変換する
function b64_to_utf8(str) {
return decodeURIComponent( escape(window.atob(str)));
}
44GE44KN44Gv いろはサンプル
/**
* BASE64とMIMEコンテンツタイプからBlobオブジェクトを作成する。
* 日本語対応。
*
* @param base64
* @param mime_ctype MIMEコンテンツタイプ
* @returns Blob
*/
function toBlob(base64,mime_ctype) {
// 日本語の文字化けに対処するためBOMを作成する。
var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
var bin = atob(base64.replace(/^.*,/, ''));
var buffer = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) {
buffer[i] = bin.charCodeAt(i);
}
// Blobを作成
try{
var blob = new Blob([bom,buffer.buffer], {
type: mime_ctype,
});
}catch (e){
return false;
}
return blob;
}
html
<input type="button" value="TEST1" onclick="test1()" /> <a id="txt_dl" href="" >ダウンロード</a><br>
javascript
function test1(){
var text1 = "いろは";
// utf8からbase64に変換する。
var b64 = utf8_to_b64(text1);
// Blobを BASE64とMIMEコンテンツタイプから作成する。
var mime_ctype = "text/plain";
var blob = toBlob(b64,mime_ctype);
// BlobURLスキームをBlobから作成する。
var blob_url = window.URL.createObjectURL(blob);
// a要素にBlobURLスキームをセットしてダウンロードできるようにする。
$('#txt_dl').attr('href',blob_url);
$('#txt_dl').attr('download','test.txt');
}
<canvas id="canvas1"></canvas>
// canvas要素から描画コンテキストを取得する
var canvas = document.getElementById('canvas1');
var ctx = canvas.getContext('2d');
// canvasへ適当に描画する
ctx.beginPath();
ctx.moveTo(10,150);
ctx.lineTo(70,10);
ctx.lineTo(150,150);
ctx.lineTo(10,40);
ctx.lineTo(140,50);
ctx.closePath();
ctx.stroke();
// canvasからデータURLスキームを経由し、BASE64を取得する
var mime_type = "jpeg/image";
var data_url = canvas.toDataURL(mime_type);// canvasからデータURLスキームを取得する。
var base64 = window.btoa(data_url);// データURLスキームからBASE64を作成する。
console.log(base64);