Como converter Blob para arquivo em JavaScript

Eu preciso fazer upload de uma imagem para o servidor NodeJS para algum diretório. Eu estou usando o módulo do nó connect-busboy para isso.

Eu tinha o dataURL da imagem que converti para blob usando o seguinte código:

 dataURLToBlob: function(dataURL) { var BASE64_MARKER = ';base64,'; if (dataURL.indexOf(BASE64_MARKER) == -1) { var parts = dataURL.split(','); var contentType = parts[0].split(':')[1]; var raw = decodeURIComponent(parts[1]); return new Blob([raw], {type: contentType}); } var parts = dataURL.split(BASE64_MARKER); var contentType = parts[0].split(':')[1]; var raw = window.atob(parts[1]); var rawLength = raw.length; var uInt8Array = new Uint8Array(rawLength); for (var i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], {type: contentType}); } 

Estou usando o AngularJS no lado do cliente. Eu tenho o código para fazer o upload de um arquivo / imagem já escrito, então eu preciso de uma maneira de converter o blob em um arquivo para fazer o upload da imagem.

Alguém poderia me ajudar com isso?

Essa function converte um Blob em um File e funciona muito bem para mim.

Baunilha JavaScript

 function blobToFile(theBlob, fileName){ //A Blob() is almost a File() - it's just missing the two properties below which we will add theBlob.lastModifiedDate = new Date(); theBlob.name = fileName; return theBlob; } 

TypeScript (com tipings apropriados)

 public blobToFile = (theBlob: Blob, fileName:string): File => { var b: any = theBlob; //A Blob() is almost a File() - it's just missing the two properties below which we will add b.lastModifiedDate = new Date(); b.name = fileName; //Cast to a File() type return theBlob; } 

Uso

 var myBlob = new Blob(); //do stuff here to give the blob some data... var myFile = blobToFile(myBlob, "my-image.png"); 

Você pode usar o construtor File:

 var file = new File([myBlob], "name"); 

De acordo com a especificação w3, isso appendá os bytes que o blob contém aos bytes para o novo object File e criará o arquivo com o nome especificado http://www.w3.org/TR/FileAPI/#dfn-file

Minha variante moderna :

 function blob2file(blobData) { const fd = new FormData(); fd.set('a', blobData); return fd.get('a'); } 

Use saveAs no projeto github FileSaver.js .

FileSaver.js implementa a interface saveAs() FileSaver em navegadores que não suportam nativamente.