FileReader
'S kullanarak readAsDataURL()
rastgele verileri bir Veri URL'sine dönüştürebilirim. Bir Veri URL'sini Blob
yerleşik tarayıcı apis kullanarak tekrar bir örneğe dönüştürmenin bir yolu var mı ?
FileReader
'S kullanarak readAsDataURL()
rastgele verileri bir Veri URL'sine dönüştürebilirim. Bir Veri URL'sini Blob
yerleşik tarayıcı apis kullanarak tekrar bir örneğe dönüştürmenin bir yolu var mı ?
Yanıtlar:
Matt kullanıcısı bir yıl önce aşağıdaki kodu önerdi ( javascript'te dataURL'yi dosya nesnesine nasıl dönüştürebilirim? )
DÜZENLEME: Bazı yorumcuların bildirdiği gibi, BlobBuilder bir süre önce kullanımdan kaldırıldı. Bu güncellenmiş koddur:
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;
}
@Adria yöntemi gibi, ancak Fetch api ile ve sadece daha küçük [ caniuse? ]
Blob yanıt türü kutudan çıkar çıkmaz işe yaradığından mime türü hakkında düşünmek zorunda değilsiniz
Uyarı: İçerik Güvenliği Politikasını (CSP) ihlal edebilir
... bunları kullanırsanız
var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
fetch(url)
.then(res => res.blob())
.then(blob => console.log(blob))
Bunu lib kullanmadan bundan daha küçük yapabileceğinizi düşünmeyin
const blob = await (await fetch(url)).blob();
fetch
asenkron API'ye sahip olmaya zorlamasıdır.
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, Data URL'dir ve dataTYPE, dosya türüdür ve ardından blob nesnesini çıktı
dataTYPE
Gömülüdür dataURI
ve bu nedenle ilk cevap olarak çözümlenen gerekir.
XHR tabanlı yöntem.
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 );
});
In modern tarayıcılarda bir yorumunda Hıristiyan d'Heureuse önerdiği bir astar kullanabilirsiniz:
const blob = await (await fetch(dataURI)).blob();
Deneyin:
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
});
}
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 );
});
DataURI'yi blob'a dönüştürme kodumu kullan Diğerlerinden daha basit ve daha temiz.
function dataURItoBlob(dataURI) {
var arr = dataURI.split(','), mime = arr[0].match(/:(.*?);/)[1];
return new Blob([atob(arr[1])], {type:mime});
}
Bu yanıtların hiçbiri base64 ve base64 olmayan dataURL'leri desteklemediğinden, işte vuamitom'un silinmiş yanıtına dayalı olan bir yanıt:
// 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})
}
}
Not: Farklı şekilde işlenmesi gerekebilecek başka dataURL mime türleri olup olmadığından emin değilim . Ama öğrenirseniz lütfen bana bildirin! DataURL'lerin istedikleri herhangi bir biçime sahip olması mümkündür ve bu durumda, özel kullanım durumunuz için doğru kodu bulmak size kalmıştır.
kullanım
FileReader.readAsArrayBuffer(Blob|File)
ziyade
FileReader.readAsDataURL(Blob|File)
ArrayBuffer
yolu kullanmak işe yaramayacak.