Mit FileReader
's readAsDataURL()
kann ich beliebige Daten in eine Daten-URL umwandeln. Gibt es eine Möglichkeit, eine Daten-URL Blob
mithilfe der integrierten Browser-APIs wieder in eine Instanz zu konvertieren ?
Mit FileReader
's readAsDataURL()
kann ich beliebige Daten in eine Daten-URL umwandeln. Gibt es eine Möglichkeit, eine Daten-URL Blob
mithilfe der integrierten Browser-APIs wieder in eine Instanz zu konvertieren ?
Antworten:
Benutzer Matt hat vor einem Jahr den folgenden Code vorgeschlagen ( Wie konvertiere ich dataURL in ein Dateiobjekt in Javascript? ), Der Ihnen helfen könnte
EDIT: Wie einige Kommentatoren berichteten, ist BlobBuilder vor einiger Zeit veraltet. Dies ist der aktualisierte Code:
function dataURItoBlob(dataURI) {
// convert base64 to raw binary data held in a string
// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
var byteString = atob(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);
// create a view into the buffer
var ia = new Uint8Array(ab);
// set the bytes of the buffer to the correct values
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
// write the ArrayBuffer to a blob, and you're done
var blob = new Blob([ab], {type: mimeString});
return blob;
}
Wie @Adria Methode, aber mit Fetch API und nur kleiner [ caniuse? ]
Sie müssen nicht über den Mimetyp nachdenken, da der Blob-Antworttyp sofort funktioniert
Warnung: Kann gegen die Content Security Policy (CSP) verstoßen
... wenn Sie dieses Material verwenden
var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
fetch(url)
.then(res => res.blob())
.then(blob => console.log(blob))
Denken Sie nicht, dass Sie es kleiner machen könnten, ohne libs zu verwenden
const blob = await (await fetch(url)).blob();
node-fetch
Dosis haben jedoch ein Konzept von Blob, aber da es serverseitig ist, ist es ziemlich nutzlos. Außerdem haben Blobs keine Erweiterungen oder Dateinamen (es ist nur ein Container zum Speichern von Daten)
dataURItoBlob : function(dataURI, dataTYPE) {
var binary = atob(dataURI.split(',')[1]), array = [];
for(var i = 0; i < binary.length; i++) array.push(binary.charCodeAt(i));
return new Blob([new Uint8Array(array)], {type: dataTYPE});
}
input dataURI ist die Daten-URL und dataTYPE ist der Dateityp und gibt dann das Blob-Objekt aus
dataTYPE
ist eingebettet in dataURI
und sollte daher wie in der ersten Antwort analysiert werden.
XHR-basierte Methode.
function dataURLtoBlob( dataUrl, callback )
{
var req = new XMLHttpRequest;
req.open( 'GET', dataUrl );
req.responseType = 'arraybuffer'; // Can't use blob directly because of https://crbug.com/412752
req.onload = function fileLoaded(e)
{
// If you require the blob to have correct mime type
var mime = this.getResponseHeader('content-type');
callback( new Blob([this.response], {type:mime}) );
};
req.send();
}
dataURLtoBlob( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==', function( blob )
{
console.log( blob );
});
Versuchen:
function dataURItoBlob(dataURI) {
if(typeof dataURI !== 'string'){
throw new Error('Invalid argument: dataURI must be a string');
}
dataURI = dataURI.split(',');
var type = dataURI[0].split(':')[1].split(';')[0],
byteString = atob(dataURI[1]),
byteStringLength = byteString.length,
arrayBuffer = new ArrayBuffer(byteStringLength),
intArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < byteStringLength; i++) {
intArray[i] = byteString.charCodeAt(i);
}
return new Blob([intArray], {
type: type
});
}
In modernen Browsern kann man den von Christian d'Heureuse vorgeschlagenen Liner in einem Kommentar verwenden:
const blob = await (await fetch(dataURI)).blob();
function dataURLtoBlob( dataUrl, callback )
{
var req = new XMLHttpRequest;
req.open( 'GET', dataUrl );
req.responseType = 'blob';
req.onload = function fileLoaded(e)
{
callback(this.response);
};
req.send();
}
var dataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
dataURLtoBlob(dataURI , function( blob )
{
console.log( blob );
});
Verwenden Sie meinen Code, um dataURI in Blob umzuwandeln. Es ist einfacher und sauberer als andere.
function dataURItoBlob(dataURI) {
var arr = dataURI.split(','), mime = arr[0].match(/:(.*?);/)[1];
return new Blob([atob(arr[1])], {type:mime});
}
Da keine dieser Antworten base64- und non-base64-dataURLs unterstützt, basiert diese auf der gelöschten Antwort von vuamitom:
// from /programming/37135417/download-canvas-as-png-in-fabric-js-giving-network-error/
var dataURLtoBlob = exports.dataURLtoBlob = function(dataurl) {
var parts = dataurl.split(','), mime = parts[0].match(/:(.*?);/)[1]
if(parts[0].indexOf('base64') !== -1) {
var bstr = atob(parts[1]), n = bstr.length, u8arr = new Uint8Array(n)
while(n--){
u8arr[n] = bstr.charCodeAt(n)
}
return new Blob([u8arr], {type:mime})
} else {
var raw = decodeURIComponent(parts[1])
return new Blob([raw], {type: mime})
}
}
Hinweis: Ich bin mir nicht sicher, ob es solche gibt andere dataURL-MIME-Typen gibt, die möglicherweise anders behandelt werden müssen. Aber bitte lassen Sie es mich wissen, wenn Sie es herausfinden! Es ist möglich, dass dataURLs einfach ein beliebiges Format haben können. In diesem Fall liegt es an Ihnen, den richtigen Code für Ihren speziellen Anwendungsfall zu finden.
verwenden
FileReader.readAsArrayBuffer(Blob|File)
eher, als
FileReader.readAsDataURL(Blob|File)
ArrayBuffer
Pfads nicht funktioniert.