¿Hay una manera de transmitir datos en un blob (o generar un blob gigante)

Verificando MDN veo que solía haber BlobBuilder y que podría llamar a blobBuilder.append para continuar agregando datos a un blob pero de acuerdo con MDN, BlobBuilder está en desuso a favor del constructor Blob . Desafortunadamente, el constructor Blob requiere todos los datos en la memoria en el momento de la construcción. Mis datos son demasiado grandes para estar en la memoria en el momento de la construcción. En cuanto a la API de File no hay nada allí tampoco.

¿Hay una manera de generar grandes clientes de datos y ponerlos en un blob? Por ejemplo, digamos que quería renderizar una imagen de 16k por 16k. Sin comprimir es una imagen de 1 gig.

Tengo un algoritmo que puede generarlo 1 o unas pocas líneas de exploración a la vez, pero necesito la forma de escribir esas líneas de exploración en un archivo / blob y luego, cuando termine, puedo usar la forma estándar para permitir que el usuario descargue esa burbuja pero, Parece que no puedo encontrar una API que me permita transmitir datos en un blob.

Lo único en lo que puedo pensar es que aparentemente puedo hacer un Blob de Blob s, así que supongo que puedo escribir cada parte de la imagen en un blob separado y luego enviar todos los blobs a otro blob para obtener un blob grande.

¿Es esa la única solución? Parece un poco … extraño. Aunque si funciona, entonces ¯ \ _ (ツ) _ / ¯


Alguien votó para cerrar ya que no entienden la pregunta. Aquí hay otra explicación.

Escribe 4 conciertos en un blob

  const arrays = []; for (let i = 0; i < 4096; ++i) { arrays.push(new Uint8Array(1024 * 1024)); // 1 meg } // arrays now holds 4 gig of data const blob = new Blob(arrays); 

El código anterior se bloqueará porque el navegador anulará la página por usar demasiada memoria. Usando BlobBuilder podría haber hecho algo como

  const builder = new BlobBuilder(); for (let i = 0; i < 4096; ++i) { const data = new Uint8Array(1024 * 1024); // 1 meg builder.append(data); } const blob = builder.getBlob(...); 

Eso no se habría quedado sin memoria porque nunca hay más de 1 meg de datos. El navegador puede vaciar los datos que se agregan al BlobBuilder al disco.

¿Cuál es la nueva forma de lograr escribir 4 gigas en un blob? ¿Es solo escribir muchos blobs pequeños y luego usarlos para generar uno más grande o hay alguna forma más tradicional en la que lo tradicional significa crear un objeto / archivo / blob / almacenamiento?

Como usted sabe, los datos que contendrá el blob deben estar listos para pasar al constructor. Tomemos el ejemplo de MDN:

 var aFileParts = ['hey!']; var oMyBlob = new Blob(aFileParts, {type : 'text/html'}); 

Ahora, tenemos dos opciones:

  1. Podemos agregar datos a la matriz y luego convertirlos en un blob:

     var aFileParts = ['hey!']; aFileParts.push('

    How are you?

    '); var oMyBlob = new Blob(aFileParts, {type : 'text/html'});
  2. Alternativamente, podemos usar blobs para crear el blob:

     var oMyOtherBlob = new Blob([], {type: 'text/html'}); oMyOtherBlob = new Blob([oMyOtherBlob, 'hey!'], {type : 'text/html'}); oMyOtherBlob= new Blob([oMyOtherBlob, '

    How are you?

    '], {type : 'text/html'});

Puede construir su propio BlobBuilder encapsulando eso … dado que el agregado a una matriz parece llevarlo a quedarse sin memoria, permítanos encapsular la segunda opción:

 var MyBlobBuilder = function() { var blob = new Blob([], {type: 'text/html'}); this.append = function(src) { blob = new Blob([blob, src], {type: 'text/html'}); }; this.getBlob = function() { return blob; } }; 

Nota: probado con su código (reemplazó BlobBuilder con MyBlobBuilder ), no se quedó sin memoria en mi máquina. Windows 10, Chrome 67, 8 GB Ram, Intel Core I3 – 64 bits.