He leído una docena de publicaciones sobre cómo convertir ArrayBuffer a Blob o Uint8Array etc. antes de enviar los datos al lado del cliente... pero parece que no puedo hacer que funcione en absoluto. Cuando obtengo los datos, no pude reconstruirlos como un Blob antes de enviarlos a un archivo.
const Blob = require('cross-blob'); const randomBytes = require('randombytes'); const buffer = randomBytes(1024); // Supposed to give me BufferLas siguientes fueron las cosas que probé...
data = buffer; ^ me da <Buffer 11 22 33 ...>
data = Uint8Array.from(buffer);^ me da una matriz de enteros, ¿esto parecía el más prometedor? pero cuando llegó al lado del cliente, se convirtió en un objeto con índices y valor de bytes...
data = Uint8Array.from(buffer).buffer; ^ da ArrayBuffer { byteLength: 1024} , cuando lo inspeccione, muestra el size: 2 y type: 'text/plain' ...
data = new Blob(buffer, { type: 'application/octet-stream' }); data = new Blob([new Uint8Array(buffer, buffer.byteOffset, buffer.length)], { type: 'application/octet-stream' }); data = new Blob([Uint8Array.from(buffer)], { type: 'application/octet-stream' }); ^ todo esto, cuando llegó al lado del cliente también con size: 2 y type: 'text/plain' ...
En el lado del servidor, estoy ejecutando Express:
router.get('/test/*', function(req, res, next) { ... let data = myFunctionThatGeneratesData(); res.send(data);});
En el lado del cliente, lo solicito así (Angular/TypeScript):
this.http.get('/test/random-bytes-array', { responseType: 'blob' // also tried 'arraybuffer' }).subscribe(data => { debugger; console.log(data); }); Debo estar haciendo algo mal ... Estoy tratando de enviar varios fragmentos de datos binarios, ya sea como ArrayBuffer , Uint8Array o Blob (lo que funcione) y cuando llegue al otro extremo, combínelos nuevamente en un Blob .
En Node.js, crypto.randomBytes devuelve un Buffer . Este es el tipo correcto para usar para enviar datos sin procesar al cliente.
Al usar Express, es importante establecer el tipo de contenido correcto de la respuesta usando res.type() . Sin embargo, al enviar un Buffer , si el encabezado de tipo de contenido no está configurado en ningún otro middleware, express usará application/octet-stream de manera predeterminada .
Cuando el parámetro es un objeto de búfer, el método establece el campo de encabezado de respuesta de tipo de contenido en "aplicación/flujo de octetos", a menos que se haya definido previamente.
router.get('/test/*', function(req, res, next) { ... let data = myFunctionThatGeneratesData(); res.type('application/octet-stream').send(data); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ might not be necessary }); Y, por último, en Angular, usar el tipo de responseType: 'blob' es correcto:
this.http.get('/test/random-bytes-array', { responseType: 'blob' }).subscribe(data => { console.log(data); });