在前端程序的開發過程中,保存二進制流是一項非常重要的技能。在javascript中,我們可以使用各種方法來保存二進制流。下面我們將針對不同的場景,進行舉例說明。
首先,對于圖片文件的保存,我們可以使用Blob對象來進行操作。Blob是代表二進制數據的對象,我們可以使用它來創建二進制數據對象(代表文件內容)。下面是一個例子:
var imgData = canvas.toDataURL('image/png');
var blob = dataURLToBlob(imgData);
var fileName = "canvasImage.png";
saveAs(blob, fileName);
function dataURLToBlob(dataURL) {
var mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0];
var byteString = atob(dataURL.split(',')[1]);
var arrayBuffer = new ArrayBuffer(byteString.length);
var intArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < byteString.length; i++) {
intArray[i] = byteString.charCodeAt(i);
}
return new Blob([arrayBuffer], {type: mimeString});
}
function saveAs(blob, fileName) {
var url = window.URL.createObjectURL(blob);
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
}
以上代碼通過canvas.toDataURL()函數獲取到圖片數據后,將其轉換成Blob對象,并通過saveAs()函數將其保存下來。其中,dataURLToBlob()函數是用來將數據URL轉換成Blob對象的。
其次,對于音頻和視頻文件的保存,則需要使用到MediaRecorder API和Blob對象。MediaRecorder API顧名思義,是一種錄音、錄像等媒體數據的操作API。下面是一個保存音頻的例子:
var audioChunks = [];
navigator.mediaDevices.getUserMedia({audio: true})
.then(function(stream) {
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.addEventListener("dataavailable", function(event) {
audioChunks.push(event.data);
});
mediaRecorder.addEventListener("stop", function() {
var audioBlob = new Blob(audioChunks, {type: 'audio/ogg'});
var audioUrl = URL.createObjectURL(audioBlob);
var a = document.createElement('a');
a.href = audioUrl;
a.download = 'test.ogg';
a.click();
});
mediaRecorder.start();
setTimeout(function() {
mediaRecorder.stop();
}, 3000);
});
以上代碼使用了getUserMedia()函數獲取到了音頻的媒體數據流,然后通過MediaRecorder API來將數據錄制成文件,并最終保存。需要注意的是,在代碼最后,我們通過setTimeout()函數來設置錄制音頻的時間。
最后,對于其他類型的二進制流文件(如PDF、DOC、EXCEL等),我們可以使用XMLHttpRequest對象和Blob對象來進行保存。下面是一個例子:
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.onload = function() {
var blob = new Blob([xhr.response], {type: 'application/pdf'});
var pdfUrl = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = pdfUrl;
a.download = 'test.pdf';
a.click();
};
xhr.open('GET', 'test.pdf');
xhr.send();
以上代碼使用了XMLHttpRequest對象來對PDF文件進行請求,然后將獲取到的二進制流文件通過Blob對象來進行保存。最終的保存操作依舊使用了標簽的download屬性來完成。
總體來說,javascript為我們在前端程序開發中保存二進制流提供了非常方便的方法。我們只需要根據具體的場景和需要來選擇不同的API和對象,就能輕松完成操作。