一、基本介紹
responsetypearraybuffer是XMLHttpRequest API中的一個重要屬性。當我們向服務器請求數據時,服務器會以不同的格式返回數據,如html、json或者二進制文件等。responsetypearraybuffer就是用來處理二進制數據的。也就是說,當我們希望從服務器請求二進制數據時,需要設置responsetype為arraybuffer。
二、常見用法
下面是一個簡單的代碼示例,我們將從服務器請求一張圖片:
let xhr = new XMLHttpRequest(); xhr.open('GET', 'http://example.com/image.png', true); xhr.responseType = 'arraybuffer'; xhr.onload = function (e) { if (this.status === 200) { let blob = new Blob([this.response], {type: 'image/png'}); let imageUrl = window.URL.createObjectURL(blob); let img = document.createElement('img'); img.src = imageUrl; document.body.appendChild(img); } }; xhr.send();
首先,我們new了一個XMLHttpRequest,並打開了一個GET請求。接下來,我們設置了responsetype為arraybuffer。然後,我們定義了一個onload事件,在請求返回後進行回調處理。如果狀態碼為200,說明請求成功,我們將response轉換為Blob類型,並將其URL化,通過img元素display出來。
三、應用場景舉例
1. 二進制文件上傳
如果我們希望上傳一份二進制文件,例如圖片或者視頻等,可以使用responsetypearraybuffer來獲取文件內容,然後通過FormData上傳到服務器:
let formData = new FormData(); let fileInput = document.getElementById('fileInput'); let file = fileInput.files[0]; let xhr = new XMLHttpRequest(); xhr.open('POST', 'http://example.com/upload', true); xhr.responseType = 'arraybuffer'; xhr.onload = function (e) { // 上傳成功的回調處理 }; let fr = new FileReader(); fr.onloadend = function () { formData.append('file', new Blob([new Uint8Array(this.result)])); xhr.send(formData); }; fr.readAsArrayBuffer(file);
代碼中通過FileReader讀取本地文件內容,將其轉換成arraybuffer類型後,存儲在formData中。最後,我們使用XMLHttpRequest將formData上傳到服務器。
2. 音視頻播放
在進行音視頻播放時,我們也需要通過responsetypearraybuffer獲取到視頻流,通過Media Source API進行播放。下面是一個簡單的示例代碼:
let video = document.getElementById('video'); let mediaSource = new MediaSource(); video.src = window.URL.createObjectURL(mediaSource); mediaSource.addEventListener('sourceopen', function () { let sourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.640029, mp4a.40.2"'); let xhr = new XMLHttpRequest(); xhr.responseType = 'arraybuffer'; xhr.onload = function (e) { sourceBuffer.appendBuffer(xhr.response); } xhr.open('GET', 'http://example.com/video.mp4', true); xhr.send(); }); video.play();
通過MediaSource的addSourceBuffer方法,將視頻媒體流加入到播放中,並通過XMLHttpRequest獲取到視頻流,再使用sourceBuffer.appendBuffer將視頻流添加到MediaSource中,最後調用video.play()進行播放。
四、常見問題
1. 跨域請求
在進行跨域請求時,由於瀏覽器的同源策略,我們無法通過XHR獲取到二進制數據,需要服務器設置CORS響應頭Access-Control-Allow-Origin,表示允許哪些域名進行跨域訪問:
Access-Control-Allow-Origin: *
在正式環境中,我們不應該將Access-Control-Allow-Origin設置為*,而應該根據實際情況將其設置為指定的域名,以提高安全性。
2. ArrayBuffer和TypedArray
在使用responsetypearraybuffer獲取二進制數據後,我們可以使用ArrayBuffer和TypedArray進行二進制數據的處理。其中,TypedArray是對ArrayBuffer的數據類型化封裝,可以更加方便地對二進制數據進行操作。例如,下面是一個將一個Int16Array轉換為ArrayBuffer的示例:
let int16Array = new Int16Array([1, 2, 3, 4, 5]); let buffer = int16Array.buffer;
使用TypedArray時需要注意,在TypedArray之間進行轉換時,只需要指定TypedArray的構造函數即可。例如,將Int16Array轉換為Int8Array,代碼如下:
let int16Array = new Int16Array([1, 2, 3, 4, 5]); let int8Array = new Int8Array(int16Array.buffer);
五、總結
responsetypearraybuffer在處理二進制數據時非常方便,可以用於文件上傳、音視頻播放等場景。在使用過程中需要注意跨域請求和TypedArray的使用,以提高代碼執行效率和安全性。
原創文章,作者:VNFF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/131520.html