Estoy escribiendo una aplicación angular de interfaz, donde el usuario debería poder cargar archivos de plantilla de MS Word (.dotx) y luego descargarlos a pedido. Debido a las limitaciones de tamaño de los archivos, tengo que cargar archivos como una matriz de bytes y los archivos se almacenarán y descargarán en este formato. El enfoque, que se describe a continuación, funciona bien con archivos .txt; sin embargo, con archivos de MS Word no funciona. El archivo de MS Word descargado tiene problemas con la codificación y no se puede leer. Parte 1: Cargar el archivo que uso para obtener el archivo del usuario:
<input type="file" class="file-input" (change)="onFileSelected($event)">Lectura de archivo a matriz de bytes ("cargando archivo"):
onFileSelected($event) { const file = $event.target.files[0] as File; const reader = new FileReader(); const fileByteArray = []; reader.readAsArrayBuffer(file); reader.onloadend = (evt) => { if (evt.target.readyState === FileReader.DONE) { const arrayBuffer = evt.target.result as ArrayBuffer; const array = new Uint8Array(arrayBuffer); for (const a of array) { fileByteArray.push(a); } this.byteArray = fileByteArray; } }; }Descargando archivo:
downloadFile() { const bytesView = new Uint8Array(this.byteArray); const str = new TextDecoder('windows-1252').decode(bytesView); //windows-1252 encoding used here for cirilic const file = new Blob([str], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'}); saveAs(file, 'test.dotx'); } No encontré problemas similares en Internet, supongo que no es una forma estándar de tratar con archivos. ¿Es posible procesar archivos de MS Word como una matriz de bytes con JS?
Otra pregunta importante: ¿es seguro cargar un archivo como una matriz de bytes, guardado en la base de datos?
Agradezco cualquier ayuda.