J'ai besoin d'une méthode efficace (native) pour convertir un fichier ArrayBuffer
à une chaîne de caractères base64 qui doit être utilisée dans un message multipartite.
Réponses
Trop de publicités?L'OP n'a pas spécifié l'environnement d'exécution, mais si vous utilisez Node.JS, il y a un moyen très simple de faire cela.
Conformément à la documentation officielle de Node.JS https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
// This step is only necessary if you don't already have a Buffer Object
const buffer = Buffer.from(yourArrayBuffer);
const base64String = buffer.toString('base64');
De plus, si vous utilisez Angular par exemple, la classe Buffer sera également disponible dans un environnement de navigateur.
Je l'ai utilisé et il me convient parfaitement.
function arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
Je recommande de ne pas utiliser le système natif btoa
car elles n'encodent pas correctement toutes les ArrayBuffer
's
[réécrire les DOM atob() et btoa()](https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_rewrite_the_DOMs_atob()_and_btoa()_using_JavaScript's_TypedArrays_and_UTF-8)
Puisque les DOMStrings sont des chaînes encodées sur 16 bits, dans la plupart des navigateurs, appeler window.btoa sur une chaîne Unicode provoquera une exception Character Out Of Range si un caractère dépasse la plage d'un caractère encodé sur 8 bits par l'ASCII.
Bien que je n'aie jamais rencontré cette erreur exacte, j'ai constaté que bon nombre des ArrayBuffer
que j'ai essayé d'encoder l'ont été de manière incorrecte.
J'utiliserais la recommandation MDN ou gist.
Si vous êtes d'accord pour ajouter une bibliothèque, base64-arraybuffer :
yarn add base64-arraybuffer
ensuite :
-
encode(buffer)
- Encode le tampon ArrayBuffer en chaîne base64 -
decode(str)
- Décode la chaîne base64 en ArrayBuffer