ArrayBuffer ã¨ãã¥ã¼ã¯ ECMA è¦æ ¼ãJavaScript ã®ä¸é¨ã§ãã
ãã©ã¦ã¶ã«ã¯ãããã« File API ã«è¨è¼ããã¦ãã髿°´æºã®ãªãã¸ã§ã¯ããããã¾ããç¹ã« Blob ã§ãã
Blob ã¯ãªãã·ã§ã³ã®æåå type (é常㯠MIMEã¿ã¤ã) 㨠blobParts â ä¸é£ã®ä»ã® Blob ãªãã¸ã§ã¯ããæååã BufferSources ããæ§æããã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã®æ§æã¯æ¬¡ã®éãã§ã:
new Blob(blobParts, options);
blobPartsã¯Blob/BufferSource/Stringã®å¤ã®é åã§ãoptionsãªãã·ã§ã³ã®ãªãã¸ã§ã¯ã:typeâ blob ã¿ã¤ã, é常ã¯ä¾ãã°image/pngã®ãã㪠MIME ã¿ã¤ãã§ã,endingsâ blob ãç¾å¨ã® OS ã®æ¹è¡(\r\nor\n)ã«å¯¾å¿ããããã«è¡æ«ã夿ãããã©ãããæå³ãã¾ããããã©ã«ãã§ã¯"transparent"(ä½ããã¾ãã)ã§ããã"native"(夿ãã)ã«ãããã¨ãã§ãã¾ãã
ä¾:
// æååãã Blob ã使ãã¾ã
let blob = new Blob(["<html>â¦</html>"], {type: 'text/html'});
// 注æãã¦ãã ãã: æåã®å¼æ°ã¯é
åã§ããå¿
è¦ãããã¾ã
// åä»ãé
åã¨æååãã Blob ã使ãã¾ã
let hello = new Uint8Array([72, 101, 108, 108, 111]); // äºé²ã§ã® "hello"
let blob = new Blob([hello, ' ', 'world'], {type: 'text/plain'});
blob ã®ä¸é¨ãæ½åºãããã¨ãã§ãã¾ã:
blob.slice([byteStart], [byteEnd], [contentType]);
byteStartâ éå§ãã¤ããããã©ã«ã㯠0ãbyteEndâ æå¾ã®ãã¤ã(ãã®ãã¤ãã¯å«ã¿ã¾ãããããã©ã«ãã¯æå¾ã¾ã§ã§ã).contentTypeâ æ°ãã blob ã®typeã§ããããã©ã«ãã¯å ã¨åãã«ãªãã¾ãã
弿°ã¯ array.slice ã«ä¼¼ã¦ãããè² ã®å¤ã許å¯ããã¾ãã
blob ã®ãã¼ã¿ãç´æ¥å¤æ´ãããã¨ã¯ã§ãã¾ããããblob ã®ä¸é¨ãåãåºãããããããããæ°ãã blob ã使ããããããããæ°ãã blob ã«ããã¯ã¹ããããããã¨ã¯ã§ãã¾ãã
ãã®æ¯ãèã㯠JavaScript ã®æååã«ä¼¼ã¦ãã¾ã: æååå ã®æåãå¤ãããã¨ã¯ã§ãã¾ããããè¨æ£ããæ°ããæååã使ãããã¨ã¯ã§ãã¾ãã
URL ã¨ãã¦ã® Blob
Blob ã¯ãã®å
容ã表示ããã®ã«ã<a>, <img> ãä»ã®ã¿ã°ã® URL ã¨ãã¦ç°¡åã«ä½¿ããã¨ãã§ãã¾ãã
type ã®ãããã§ blob ããã¦ã³ãã¼ã/ã¢ãããã¼ããããã¨ãå¯è½ã§ãããã¯ãããã¯ã¼ã¯ãªã¯ã¨ã¹ãã§ã¯ãã¡ãã Content-Type ã«ãªãã¾ãã
ç°¡åä¾ããå§ãã¦ã¿ã¾ãããããªã³ã¯ãã¯ãªãã¯ããã¨ãhello world ã®å
容ããã¤ãåçã«çæããã blob ããã¡ã¤ã«ã¨ãã¦ãã¦ã³ãã¼ããã¾ãã:
<!-- download 屿§ã¯ããã©ã¦ã¶ã¯ç§»åãã代ããã«ãã¦ã³ãã¼ããè¡ãã¾ã -->
<a download="hello.txt" href='#' id="link">Download</a>
<script>
let blob = new Blob(["Hello, world!"], {type: 'text/plain'});
link.href = URL.createObjectURL(blob);
</script>
ã¾ããJavaScript ã§åçã«ãªã³ã¯ã使ããlink.click() ã«ããã¯ãªãã¯ãã·ãã¥ã¬ã¼ããããã¨ãã§ãã¾ããããã¨ããã¦ã³ãã¼ãã¯èªåçã«å§ã¾ãã¾ãã
ãã㯠HTML ãªãã§ãåçã«çæããã Blob ãå©ç¨è ã«ãã¦ã³ãã¼ããããé¡ä¼¼ã®ã³ã¼ãã§ã:
let link = document.createElement('a');
link.download = 'hello.txt';
let blob = new Blob(['Hello, world!'], {type: 'text/plain'});
link.href = URL.createObjectURL(blob);
link.click();
URL.revokeObjectURL(link.href);
URL.createObjectURL 㯠blob ãåããblob:<origin>/<uuid> ã¨ããå½¢å¼ã®ä¸æãªURLãçæãã¾ãã
ããã¯ãlink.href ã®å¤ãã©ã®ããã«è¦ãããã®ä¾ã§ã:
blob:https://javascript.info/1e67e00e-860d-40a5-89ae-6ab0cbee6273
URL.createObjectURL ã«ããçæãããå URL ã«å¯¾ãã¦ããã©ã¦ã¶ã¯ url â blob ã®ãããã³ã°ãå
é¨ã«æ ¼ç´ãã¾ãããã®ãããurl ã¯çãã§ãããblob ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
çæããã url (ã¨ããã¸ã®ãªã³ã¯)ã¯ç¾å¨ã®ããã¥ã¡ã³ãå
ã§ããã¤éãã¦ããéã®ã¿æå¹ã§ããããã«ããã<img>, <a> ãåºæ¬çã« url ãæ³å®ãããããããªãã¸ã§ã¯ãã§ blob ãåç
§ãããã¨ãã§ãã¾ãã
ããããå¯ä½ç¨ãããã¾ããblob ã®ãããã³ã°ãããéãblob èªèº«ã¯ã¡ã¢ãªå ã«åå¨ãç¶ãã¾ãããã©ã¦ã¶ã¯ãããè§£æ¾ãããã¨ã¯ã§ãã¾ããã
ãããã³ã°ã¯ãããã¥ã¡ã³ããã¢ã³ãã¼ããããã¨èªåçã«ã¯ãªã¢ãããblob ããã®ã¨ãè§£æ¾ããã¾ãããããã¢ããªã±ã¼ã·ã§ã³ã®å¯¿å½ãé·ããã°ãããã«ã¯ããã¯èµ·ãã¾ããã
ãããã£ã¦ãURL ã使ããã¨ããã以ä¸å¿ è¦ãªããªã£ã¦ããblob ã¯ã¡ã¢ãªã«æºã¾ãã¾ãã
URL.revokeObjectURL(url) ã¯å
é¨ã®ãããã³ã°ããåç
§ãåé¤ãã¾ããããã«ãã blob ãåé¤ãã(ä»ã«åç
§ããªãå ´å)ãã¡ã¢ãªãè§£æ¾ãããã¨ãã§ãã¾ãã
æå¾ã®ä¾ã§ã¯ãblob ã¯å³æãã¦ã³ãã¼ãã®ããã«ãä¸åº¦ã ã使ããããã¨ãæå³ãã¦ããã®ã§ãããã« URL.revokeObjectURL(link.href) ãå¼ã³åºãã¾ãã
ããããã¯ãªãã¯å¯è½ãª HTML ãªã³ã¯ã®ããåã®ä¾ã§ã¯ãURL.revokeObjectURL(link.href) ãå¼ã³åºãã¾ããããªããªãããã㯠blob url ãç¡å¹ã«ããããã§ãã失å¹å¾ã¯ããããã³ã°ãåé¤ããã¦ããã®ã§ãurl ã¯æ©è½ããªããªãã¾ãã
Blob ã base64 ã«ãã
URL.createObjectURL ã®ä»£æ¿ã¯ blob ã base64 ã¨ã³ã³ã¼ããããæååã«å¤æããæ¹æ³ã§ãã
ãã®ã¨ã³ã³ã¼ãã£ã³ã°ã¯ã0 ãã 64 ã¾ã§ã® ASCII ã³ã¼ããç¨ãã¦ããã¤ããªãã¼ã¿ãå®å ¨ã§ âèªã¿åºãå¯è½ãªâ æååã¨ãã¦è¡¨ç¾ãã¾ããããã¦ããéè¦ãªãã¨ã¯ãâdata-urlâ ã§ãã®ã¨ã³ã³ã¼ãã£ã³ã°ã使ç¨ã§ãããã¨ã§ãã
data url 㯠data:[<mediatype>][;base64],<data> ã®å½¢å¼ã§ãããã®ãã㪠url 㯠âé常ã®â url ã¨åçã«ãããããå ´æã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
ä¾ãã°ãããã¯ã¹ãã¤ãªã¼ã§ã:
<img src="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7">
ãã©ã¦ã¶ã¯æååããã³ã¼ãããã¤ã¡ã¼ã¸ã表示ãã¾ã:
blob ã base64 ã«å¤æããããã«ã¯ãçµã¿è¾¼ã¿ã® FileReader ãªãã¸ã§ã¯ãã使ç¨ãã¾ããããã¯è¤æ°ã®ãã©ã¼ãããã§ blob ãããã¼ã¿ãèªããã¨ãã§ãã¾ããæ¬¡ã®ãã£ãã¿ã¼ã§ã¯ããã詳ãã説æãã¾ãã
ããã¯ãblob ããã¦ã³ãã¼ãããã§ãbase64 çµç±ã§ã:
let link = document.createElement('a');
link.download = 'hello.txt';
let blob = new Blob(['Hello, world!'], {type: 'text/plain'});
let reader = new FileReader();
reader.readAsDataURL(blob); // blob ã base64 ã¸å¤æã onload ãå¼ã³åºãã¾ã
reader.onload = function() {
link.href = reader.result; // data url
link.click();
};
blob ã® URL ã使ããæ¹æ³ã¯ä¸¡æ¹ã¨ã使ç¨å¯è½ã§ããããããé常㯠URL.createObjectURL(blob) ãããã·ã³ãã«ã§éãã§ãã
- ã¡ã¢ãªãæ°ã«ããå ´åã¯ãç¡å¹ã«ããå¿ è¦ãããã¾ãã
- blob ã¸ã®ç´æ¥ã¢ã¯ã»ã¹ãâencoding/decodingâ ã¯ããã¾ããã
- ä½ãç¡å¹ã«ããå¿ è¦ã¯ããã¾ããã
- 巨大㪠blob ã®ã¨ã³ã³ã¼ãã£ã³ã°ã§ã¯ãããã©ã¼ãã³ã¹ã¨ã¡ã¢ãªã失ãã¾ãã
Image ã blob ã«ãã
ç»åãç»åã®ä¸é¨ããããã¯ãã¼ã¸ã®ã¹ã¯ãªã¼ã³ã·ã§ããã® blob ã使ãããã¨ãã§ãã¾ããã©ããã«ã¢ãããã¼ãããã¨ãã«ä¾¿å©ã§ãã
ç»åæä½ã¯ <canvas> è¦ç´ ãéãã¦è¡ããã¾ã:
- canvas.drawImage ã使ã£ã¦ãcanvas ä¸ã§ç»å(ã¾ãã¯ä¸é¨)ãæ¸ãã¾ãã
- blob ã使ããå®äºæã«
callbackãå®è¡ãã canvas ã¡ã½ãã .toBlob(callback, format, quality) ãå¼ã³åºãã¾ãã
ä¸è¨ã®ä¾ã§ã¯ãç»åãåã«ã³ãã¼ãã¦ãã¾ãããblob ã使ããéã« canvas ä¸ã§åãåã£ããå¤å½¢ããããã¨ãã§ãã¾ãã:
// ç»åãåãã¾ã
let img = document.querySelector('img');
// åããµã¤ãºã® <canvas> ãä½ãã¾ã
let canvas = document.createElement('canvas');
canvas.width = img.clientWidth;
canvas.height = img.clientHeight;
let context = canvas.getContext('2d');
// ç»åãã³ãã¼ãã¾ã (ãã®ã¡ã½ããã§ç»åãã«ãããããã¨ãã§ãã¾ã)
context.drawImage(img, 0, 0);
// canvas ä¸ã§ã¯ãcontext.rotate(), ããã®ä»æ§ã
ãªãã¨ãã§ãã¾ã
// toBlob ã¯éåææä½ã§ãcallback ã¯å®äºæã«å¼ã°ãã¾ã
canvas.toBlob(function(blob) {
// blob ã®æºåãã§ããã®ã§ãã¦ã³ãã¼ããã¾ã
let link = document.createElement('a');
link.download = 'example.png';
link.href = URL.createObjectURL(blob);
link.click();
// ãã©ã¦ã¶ãã¡ã¢ãªãã¯ãªã¢ã§ãããããå
é¨ã® blob ã¸ã®åç
§ãåé¤ãã¾ãã
URL.revokeObjectURL(link.href);
}, 'image/png');
ã³ã¼ã«ããã¯ãã async/await ã好ãå ´åã¯æ¬¡ã®ããã«ãªãã¾ã:
let blob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
ãã¼ã¸ãã¹ã¯ãªã¼ã³ã·ã§ããããã«ã¯ãhttps://github.com/niklasvh/html2canvas ã®ãããªã©ã¤ãã©ãªã使ãã¾ããããããã¦ãããã¨ã¯ãåã«ãã¼ã¸ãè¦ã¦ <canvas> ä¸ã«ãããæãã¦ããã ãã§ããããã¦ãä¸ã¨åãæ¹æ³ã§ãã® blob ãåå¾ãããã¨ãã§ãã¾ãã
Blob ãã ArrayBuffer ã¸
Blob ã³ã³ã¹ãã©ã¯ã¿ã¯ãBufferSource ãå«ããã»ã¼ä½ããã§ã blob ã使ãããã¨ãã§ãã¾ãã
ããããä½ã¬ãã«ã®å¦çãå®è¡ããå¿
è¦ãããå ´åãFileReader ã使ã£ã¦ãæãä½ã¬ãã«ã§ãã ArrayBuffer ãåå¾ãããã¨ãã§ãã¾ãã:
// blob ãã arrayBuffer ãåå¾
let fileReader = new FileReader();
fileReader.readAsArrayBuffer(blob);
fileReader.onload = function(event) {
let arrayBuffer = fileReader.result;
};
ãµããª
ArrayBuffer, Uint8Array ããã®ä»ã® BufferSource ã âãã¤ããªãã¼ã¿â ã§ãã䏿¹ãBlob 㯠âã¿ã¤ããæã¤ãã¤ããªãã¼ã¿â ã表ãã¾ãã
ãã㯠Blob ã®ã¢ãããã¼ã/ãã¦ã³ãã¼ãæä½ã便å©ã«ãããã©ã¦ã¶ã§ã¯ä¸è¬çã§ãã
XMLHttpRequest, è¨äº "fetch-basics" ãè¦ã¤ããã¾ãã ãªã©ã® webãªã¯ã¨ã¹ããè¡ãã¡ã½ããã¯ãä»ã®ãã¤ããªã¿ã¤ãã¨åæ§ã«ãBlob ããã¤ãã£ãã«ä½¿ç¨ãããã¨ãã§ãã¾ãã
Blob ã¨ä½ã¬ãã«ã®ãã¤ããªãã¼ã¿åã®éã®å¤æã¯å®¹æã«è¡ããã¨ãã§ãã¾ãã:
new Blob(...)ã³ã³ã¹ãã©ã¯ã¿ã使ç¨ãã¦ãåä»ãé åãã Blob ã使ãããã¨ãã§ãã¾ããFileReaderã使ç¨ãã¦ãBlob ããArrayBufferã«æ»ããã¨ãã§ããä½ã¬ãã«ã®ãã¤ããªå¦çã®ããã«ãã¥ã¼ã使ãããã¨ãã§ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã