Cómo leer y procesar archivos con la API FileReader de JavaScript

Introducción
Navegadores web que admiten FileReader
y input type="file"
permiten a los usuarios cargar archivos.
En este artículo, explorará las API File
, FileReader
y FileReaderSync
.
Prerrequisitos
Si deseas seguir este artículo, necesitarás:
- Será útil comprender los métodos de JavaScript ,
EventListener
y .Promises
- Un editor de código.
- Un navegador web moderno que admite
File
,FileReader
, yFileReaderSync
.
Subir un archivo
Primero, para obtener un archivo de un usuario, necesitamos usar un input
elemento:
input type="file" /
Este código permitirá a los usuarios cargar archivos desde sus máquinas.
A continuación se muestra un ejemplo de cómo cargar un archivo mediante HTML form
:
form enctype="multipart/form-data" action="/upload" method="post" input type="file" //form
Para un mayor control en el manejo de las cargas, puedes utilizar JavaScript en lugar de HTML form
para enviar los archivos:
let file = document.getElementById('input').files[0];let formData = new FormData();formData.append('file', file);fetch('/upload/image', {method: "POST", body: formData});
Este enfoque utiliza FormData
y fetch
.
Uso File Blobde propiedades
En los navegadores modernos, Files
tienen Blob
propiedades y funciones. Estas funciones nos permiten leer el archivo.
.text()
transforma el archivo en un flujo y luego en una cadena..stream()
devuelve unReadableStream
..arrayBuffer()
devuelve unArrayBuffer
que contiene los datos del blob en formato binario..slice()
permite obtener partes del archivo.
Crea un nuevo myFile.txt
archivo con algo de texto:
miArchivo.txt
Example file content.
Luego, crea un nuevo file-blob-example.html
archivo:
archivo-blob-ejemplo.html
!DOCTYPE htmlhtmlbody input type="file" / script const streamToText = async (blob) = { const readableStream = await blob.getReader(); const chunk = await readableStream.read(); return new TextDecoder('utf-8').decode(chunk.value); }; const bufferToText = (buffer) = { const bufferByteLength = buffer.byteLength; const bufferUint8Array = new Uint8Array(buffer, 0, bufferByteLength); return new TextDecoder().decode(bufferUint8Array); }; document.getElementById('input').addEventListener('change', function(e) { let file = document.getElementById('input').files[0]; (async () = { const fileContent = await file.text(); console.log('.text()', fileContent); const fileContentStream = await file.stream(); console.log('.stream()', await streamToText(fileContentStream)); const buffer = await file.arrayBuffer(); console.log('.buffer()', bufferToText(buffer)); const fileSliceBlob = file.slice(0, file.length); const fileSliceBlobStream = await fileSliceBlob.stream(); console.log('.slice() and .stream()', await streamToText(fileSliceBlobStream)); })(); }); /script/body/html
Ábrelo file-blob-example.html
en tu navegador web y agrega el myFile.txt
archivo a la carpeta input
. En tu consola de desarrollador web, verás que el contenido del archivo se lee en voz alta usando .text()
, .stream()
, .buffer()
y .slice()
.
Este enfoque utiliza ReadableStream
, TextDecoder()
, y Uint8Array()
.
Aplicación FileReaderdel ciclo de vida y métodos
Hay 6 eventos principales asociados a FileReader:
loadstart
:Se activa cuando comenzamos a cargar un archivo.progress
:Se activa cuando el blob se lee en la memoria.abort
:Se dispara cuando llamamos.abort
.error
:Se activa cuando se produce un error.load
:Se activa cuando la lectura es exitosa.loadend
:Se activa cuando se carga el archivo y no se llama a error o abort o si la carga inicia una nueva lectura.
Para empezar a cargar nuestro archivo tenemos cuatro métodos:
readAsArrayBuffer(file)
: Lee el archivo o blob como un búfer de matriz. Un caso de uso es enviar archivos grandes a un trabajador de servicio.readAsBinaryString(file)
: Lee el archivo como una cadena binariareadAsText(file, format)
:Lee el archivo como USVString (casi como una cadena) y puede especificar un formato opcional.readAsDataURL(file)
:Esto devolverá una URL donde podrá acceder al contenido del archivo, está codificado en Base64 y listo para enviarse a su servidor.
Crea un nuevo filereader-example.html
archivo que utilice readAsDataURL()
:
ejemplo-de-lector-de-archivos.html
!DOCTYPE htmlhtmlhead style body { background: #000; color: white; } #progress-bar { margin-top: 1em; width: 100vw; height: 1em; background: red; transition: 0.3s; } /style/headbody input type="file" / progress value="0" max="100"/progress div/div script const changeStatus = (status) = { document.getElementById('status').innerHTML = status; } const setProgress = (e) = { const fr = e.target; const loadingPercentage = 100 * e.loaded / e.total; document.getElementById('progress-bar').value = loadingPercentage; } const loaded = (e) = { const fr = e.target; var result = fr.result; changeStatus('Finished Loading!'); console.log('Result:', result); } const errorHandler = (e) = { changeStatus('Error: ' + e.target.error.name); } const processFile = (file) = { const fr = new FileReader(); fr.readAsDataURL(file); fr.addEventListener('loadstart', changeStatus('Start Loading')); fr.addEventListener('load', changeStatus('Loaded')); fr.addEventListener('loadend', loaded); fr.addEventListener('progress', setProgress); fr.addEventListener('error', errorHandler); fr.addEventListener('abort', changeStatus('Interrupted')); } document.getElementById('input').addEventListener('change', (e) = { const file = document.getElementById('input').files[0]; if (file) { processFile(file); } }); /script/body/html
Ábralo filereader-example.html
en su navegador web y agregue el myFile.txt
archivo a la carpeta input
. Aparecerá una barra de progreso en la pantalla a medida que se procesa el archivo. Si se carga correctamente, indicará 'Start Loading'
, 'Loaded'
, y 'Finished Loading'
.
UsandoFileReaderSync
FileReader
es una API asincrónica porque no queremos bloquear el hilo principal mientras leemos archivos. Por ejemplo, no queremos que nuestra interfaz de usuario deje de funcionar cuando el navegador intenta leer un archivo muy grande. Sin embargo, existe una versión sincrónica de FileReader
llamada FileReaderSync
. Solo podemos usarla FileReaderSync
en Web Workers. Los Web Workers tienen su propio hilo, por lo que no bloquearán el hilo principal. FileReaderSync
usa los mismos métodos que FileReader
:
FileReaderSync.readAsArrayBuffer()
FileReaderSync.readAsBinaryString()
FileReaderSync.readAsText()
FileReaderSync.readAsDataURL()
No hay controladores de eventos porque es sincrónico.
Conclusión
En este artículo, exploró las API File
, FileReader
y FileReaderSync
.
Tómese el tiempo para verificar la compatibilidad del navegador con estas funciones para asegurarse de que sean aplicables a los usuarios de sus proyectos.
- ¿Puedo utilizar
File
API? - ¿Puedo utilizar
FileReader
API? - ¿Puedo utilizar
FileReaderSync
API?
Continúe su aprendizaje con API web adicionales .
Deja una respuesta