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);