Estoy interesado en leer desde el archivo a mi propio búfer, para evitar una copia adicional.
Parece que hay una tecnología experimental ReadableStreamBYOBReader . Probé en MS Edge que se espera que sea compatible de acuerdo con la tabla de compatibilidad del navegador , así como con caniuse .
Aquí está el fragmento que esperaba ejecutar en un navegador compatible con la función, ¿puede detectar un error o explicar por qué no funciona?
console.log(navigator.userAgent) document.querySelector('#input-file').addEventListener('change', async (e) => { if(e.target.files[0]){ try{ // Compare two methods of reading a file const file = e.target.files[0]; const stream = file.stream(); const slice = await file.slice(0, Math.min(file.size, 16)).arrayBuffer() const my_own_array = new Uint8Array(Math.min(file.size, 16)); // Here is where it fails in my browser const reader = stream.getReader({mode:'byob'}) console.log(await reader.read(my_own_array)); slice_array = new Int8Array(slice); // I expect both arrays to have the same data since I read the same file console.log({allEqual: slice_array.every((v, i) => v === my_wn_array[i])}) console.log(my_own_buffer); }catch(e){ console.log(e.toString()) } } }) Select a file and the script will attempt to load it <input type=file id=input-file>Lo que veo aquí es
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38` TypeError: Failed to execute 'getReader' on 'ReadableStream': Cannot use a BYOB reader with a non-byte streamSi funciona en su navegador, por favor, hágamelo saber en los comentarios.
EDITAR : como señaló Xeelley , debería haber pasado {mode:'byob'} en lugar de 'byob' .
Consulte MDN ReadableStream.getReader() Docs.
getReader acepta 1 parámetro opcional con tipo de object . Entonces, si necesita un lector BYOB, debe pasar la configuración del lector de esta manera:
file.stream().getReader({ mode: 'byob' })