2013-01-13 13 views
15

Tôi đang lấy một ArrayBuffer trên XHR và muốn lưu nó vào API FileSystem bằng cách sử dụng một FileWriter. FileWriter mong đợi một hàm tạo Blob và Blob sẽ không lấy một ArrayBuffer, nó sẽ lấy một ArrayBufferView.ArrayBufferView

Có nhiều ArrayBufferView để chọn, làm thế nào để tôi biết cái nào là đúng để sử dụng?

+0

Còn việc sử dụng JSON thì sao? –

Trả lời

14

Tại MDN, bạn có thể tìm thấy một cái nhìn tổng quan của tất cả sẵn ArrayBufferView lớp con:

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 

Về cơ bản, đây liệt kê không gian nhớ những gì từng hạng mục của mảng sẽ chiếm và nếu nó là một con số đơn giản hoặc một số FP. Tôi không chắc chắn ngôn ngữ bạn quen thuộc, nhưng nếu nó cũng bao gồm Java, thì về cơ bản cũng giống như bạn chọn trên byte[], short[], int[], float[]double[] (Java luôn được ký, để một phần không quan trọng).

Chúng tôi biết, dữ liệu nhị phân như hình ảnh thường được biểu diễn dưới dạng mảng byte. Một mảng ngắn/int/dài cũng có thể, nhưng đây là một sự lãng phí không gian bộ nhớ. Nếu bạn lưu trữ một hình ảnh 100KB (lưu ý rằng "B" là viết tắt của byte, là 8 bit) trong một mảng int thay vì một mảng byte, sau đó nó sẽ chiếm 400KB bộ nhớ, đó là một sự lãng phí 300KB. Vì vậy, cái nhỏ nhất, Int8Array, sẽ đủ cho không gian bộ nhớ. Nếu bạn muốn lập trình ngang qua nó — mà rất ít khả năng xảy ra trong trường hợp này — là mảng không dấu, thì bạn có thể chọn thay thế cho Uint8Array thay vào đó mỗi mục giữ giá trị 0 đến 255 thay vì giá trị -128 đến 127.

Dưới đây là ví dụ về khởi động sao chép để tải xuống tệp hình ảnh từ máy chủ, lưu nó vào vùng lưu trữ cục bộ tạm thời và hiển thị nó dưới dạng <img> trong cơ thể. phần). Ví dụ này giả định rằng các tập tin image.png nằm trong thư mục cơ sở giống như JS (hoặc HTML, trong trường hợp JS trực tiếp) tập tin được được tải về từ:

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

Lưu ý, tính đến tình trạng current, tác phẩm này chỉ trong Chrome.