Какой ArrayBufferView
я извлекаю ArrayBuffer через XHR и хочу сохранить его в API файловой системы с помощью FileWriter. FileWriter ожидает Blob, и конструктор Blob не будет принимать ArrayBuffer, он принимает ArrayBufferView.
есть много ArrayBufferViews на выбор, как я знаю, что правильно использовать?
1 ответов
At MDN, вы можете найти обзор всех существующих ArrayBufferView
подклассы:
Type | Size | Description | Equivalent C type
-------------+------+---------------------------------------+------------------
Int8Array | 1 | 8-bit twos complement signed integer | signed char
Uint8Array | 1 | 8-bit unsigned integer | unsigned char
Int16Array | 2 | 16-bit twos complement signed integer | short
Uint16Array | 2 | 16-bit unsigned integer | unsigned short
Int32Array | 4 | 32-bit twos complement signed integer | int
Uint32Array | 4 | 32-bit unsigned integer | unsigned int
Float32Array | 4 | 32-bit IEEE floating point number | float
Float64Array | 8 | 64-bit IEEE floating point number | double
в основном, это перечисляет, какие пространства памяти каждый элемент массива будет занимать, и если это простое число или число FP. Я не уверен, с какими языками вы знакомы, но если он также охватывает Java, то это в основном тот же выбор, который вы сделали бы на byte[]
, short[]
, int[]
, float[]
и double[]
(Java всегда подписывается, так что эта часть не вопрос.)
мы знаем, двоичные данные, такие как изображения, обычно представлены в виде массива байтов. Короткий/int / длинный массив также может, но это пустая трата пространства памяти. Если бы вы сохранили изображение 100KB (обратите внимание, что "B" означает байт, который составляет 8 бит) в массиве int вместо массива байтов, то он занял бы 400KB памяти, что является пустой тратой 300KB. Так что самый маленький,Int8Array
, уже достаточно в отношении пространства памяти. Если вы когда-нибудь хотели бы программно пересечь его - что очень маловероятно в этом случае - как массив без знака, то вы можете выбрать Uint8Array
вместо этого, где каждый элемент содержит значения 0
to 255
вместо значения -128
to 127
.
вот пример copy'n'paste'n'Runnable kickoff, который загружает файл изображения с сервера, сохраняет его во временное локальное пространство хранения и представляет его как <img>
в теле (для этой части требуется немного jQuery). В этом примере предполагается, что это расположенный в той же базовой папке, что и файл JS (или HTML, если JS встроен), был загружен из:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.TEMPORARY, 1024*1024, startDownload, errorHandler);
var errorHandler = function(error) {
console.log('FS error: ' + error);
}
var xhr = new XMLHttpRequest();
xhr.open('GET', 'image.png', true);
xhr.responseType = 'arraybuffer';
function startDownload(fileSystem) {
xhr.onload = function(event) {
var content = new Int8Array(this.response);
fileSystem.root.getFile('/image.png', { 'create': true }, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function(event) {
$('body').append('<p>Image successfully downloaded:</p>')
.append('<p><img src="' + fileEntry.toURL() + '"/></p>');
};
var blob = new Blob([content], { type: 'image/png' });
fileWriter.write(blob);
}, errorHandler);
});
}
xhr.send();
}
Примечание, начиная с настоящее государство, это работает только в Chrome.