Eu estava estudando Blobs e percebi que quando você tem um ArrayBuffer, pode facilmente convertê-lo em um Blob da seguinte maneira:
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
A pergunta que tenho agora é: é possível ir de um Blob para um ArrayBuffer?
javascript
blob
arraybuffer
Jeanluca Scaljeri
fonte
fonte
Blob
não podem ser lidos diretamente, mas isso pode ser feito com algumas APIs.Respostas:
A
Response
API consome um (imutável)Blob
do qual os dados podem ser recuperados de várias maneiras. O OP apenas pediuArrayBuffer
, e aqui está uma demonstração disso.como alternativa, você pode usar isto:
fonte
Blob.arrayBuffer()
qual, na verdade, tem uma compatibilidade muito pobre, mesmo em 2020, caniuse.com/#feat=mdn-api_blob_arraybuffer ou developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBufferVocê pode usar
FileReader
para ler oBlob
como umArrayBuffer
.Aqui está um pequeno exemplo:
Aqui está um exemplo mais longo:
Isso foi testado no console do Chrome 27—69, Firefox 20—60 e Safari 6—11.
Aqui está também uma demonstração ao vivo com a qual você pode jogar: https://jsfiddle.net/potatosalad/FbaM6/
Atualização 23/06/2018: Obrigado a Klaus Klein pela dica sobre
event.target.result
versusthis.result
Referência:
fonte
this
.<EventTarget>.result
deve consertar isso!Só para complementar a resposta do Sr. @potatosalad.
Na verdade, você não precisa acessar o escopo da função para obter o resultado no retorno de chamada onload , você pode fazer o seguinte livremente no parâmetro do evento :
Por que isso é melhor? Porque então podemos usar a função de seta sem perder o contexto
fonte
Ou você pode usar a API fetch
Eu não sei qual é a diferença de desempenho, e isso aparecerá na sua guia de rede no DevTools também.
fonte
new Response(blob).arrayBuffer()
Há agora (Chrome 76+ e 69+ FF) uma Blob.prototype.arrayBuffer () método que irá retornar uma promessa resolver com um ArrayBuffer representando os dados do BLOB.
fonte