Uczyłem się blobów i zauważyłem, że kiedy masz ArrayBuffer, możesz łatwo przekonwertować go na Blob w następujący sposób:
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
Pytanie, które mam teraz, brzmi: czy można przejść z obiektu Blob do ArrayBuffer?
javascript
blob
arraybuffer
Jeanluca Scaljeri
źródło
źródło
Blob
nie można odczytać bezpośrednio, ale można to zrobić za pomocą niektórych interfejsów API.Odpowiedzi:
Response
API zużywa (niezmienna)Blob
, z których dane można odczytać na kilka sposobów. OP poprosił tylko oArrayBuffer
, a tu pokaz niego.alternatywnie możesz użyć tego:
źródło
Blob.arrayBuffer()
którą faktycznie ma dość słabą kompatybilność nawet w 2020 roku, caniuse.com/#feat=mdn-api_blob_arraybuffer lub developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBufferMożesz użyć,
FileReader
aby przeczytaćBlob
jako plikArrayBuffer
.Oto krótki przykład:
Oto dłuższy przykład:
Zostało to przetestowane w konsoli Chrome 27–69, Firefox 20–60 i Safari 6–11.
Oto także demonstracja na żywo, z którą możesz grać: https://jsfiddle.net/potatosalad/FbaM6/
Aktualizacja 2018-06-23: Dzięki Klausowi Kleinowi za wskazówkę dotyczącą
event.target.result
versusthis.result
Odniesienie:
źródło
this
.<EventTarget>.result
powinien to naprawić!Tylko jako uzupełnienie odpowiedzi Pana @potatosalad.
W rzeczywistości nie musisz uzyskiwać dostępu do zakresu funkcji, aby uzyskać wynik wywołania zwrotnego onload , możesz swobodnie wykonać następujące czynności na parametrze zdarzenia :
Dlaczego to jest lepsze? Ponieważ wtedy możemy użyć funkcji strzałkowej bez utraty kontekstu
źródło
Lub możesz użyć interfejsu API pobierania
Nie wiem, jaka jest różnica w wydajności, a pojawi się ona również na karcie sieci w DevTools.
źródło
new Response(blob).arrayBuffer()
Jest teraz (Chrome 76+ i FF 69+) metoda Blob.prototype.arrayBuffer () , która zwróci Obietnicę rozstrzygającą z ArrayBuffer reprezentującą dane Bloba.
źródło