Blob URL'sini normal URL'ye dönüştür


99

Sayfam şöyle bir URL oluşturuyor: "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f"Bunu normal bir adrese nasıl dönüştürebilirim?

Bir olarak kullanıyorum <img>bireyin srcözniteliği.


1
URL'nin kodunu çözdükten sonra bile, hala bir localhostbağlantıdır. Bunun yerine genel bağlantısını bulun. (hangi CDN'yi kullanıyorsunuz?)
Raptor

Javascript kullanmak istiyorum.
Jacob

Kullanım stackvoverflow bağlantısını .. ve W3C Gerçek sorun kodunuzu dağıtmak çevresinden bağımsız hale getirmek için nasıl olacak
user1428716

Blob adresinden genel URL'yi bulmanın bir yolu var mı? Sahip olduğum tek değer bu.
Jacob

Yanıtlar:


169

JavaScript'ten oluşturulan bir URL, Blob"normal" bir URL'ye dönüştürülemez.

Bir blob:URL, sunucuda bulunan verilere atıfta bulunmaz, tarayıcınızın o anda mevcut sayfa için hafızasında bulunan verilere başvurur. Diğer sayfalarda kullanılamayacak, diğer tarayıcılarda kullanılamayacak ve diğer bilgisayarlardan kullanılamayacaktır.

Bu nedenle, genel olarak bir BlobURL'yi "normal" bir URL'ye dönüştürmek mantıklı değildir . Sıradan bir URL istiyorsanız, verileri tarayıcıdan bir sunucuya göndermeniz ve sunucunun bunu sıradan bir dosya gibi kullanıma sunmasını sağlamanız gerekir.

En azından Chrome'da blob:bir data:URL'yi bir URL'ye dönüştürmek mümkündür . Verileri blob:URL’den "almak" için bir AJAX isteği kullanabilirsiniz (HTTP isteğinde bulunmak yerine gerçekten tarayıcınızın belleğinden çekiyor olsa da).

İşte bir örnek:

var blob = new Blob(["Hello, world!"], { type: 'text/plain' });
var blobUrl = URL.createObjectURL(blob);

var xhr = new XMLHttpRequest;
xhr.responseType = 'blob';

xhr.onload = function() {
   var recoveredBlob = xhr.response;

   var reader = new FileReader;

   reader.onload = function() {
     var blobAsDataUrl = reader.result;
     window.location = blobAsDataUrl;
   };

   reader.readAsDataURL(recoveredBlob);
};

xhr.open('GET', blobUrl);
xhr.send();

data:URL'ler muhtemelen "normal" derken kastettiğiniz şey değildir ve sorunlu bir şekilde büyük olabilir. Ancak, paylaşılabildikleri için normal URL'ler gibi çalışırlar; mevcut tarayıcıya veya oturuma özel değillerdir.


15
Blob url'leri sunucu verilerini göstermiyorsa, Youtube videolarının src url'si nasıl görünür: src = "blob: https% 3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67" (in Chrome)
bhh1988

5
@ bhh1988 Bu çok ilginç bir keşif. Orada neler olduğundan emin değilim. Bu gönderide açıklandığı gibi, bir XMLHttpRequest kullanarak src blob URL'sini almaya çalışırsam, hiçbir içerik döndürülmez. Tahminime göre, ya (a) başka bir kaynaktan veri beslerken bir yer tutucu olarak kullanmak için herhangi bir boş Blob URL'si oluşturdular ya da (b) Blob bir şekilde şifrelenmiş veriler için bir proxy görevi görüyor (HTML5 Şifreli Medya Uzantıları aracılığıyla). Ancak pratikte bunlardan herhangi birinin nasıl yapılacağından emin değilim.
Jeremy

20
@ bhh1988 Görünüşe göre medya kaynağı uzantıları , JavaScript tarafından yönetilen medya akışları için blob URL'lerinin oluşturulmasına izin veriyor. Bunlar, bu gönderide tartışılan blob URL'leri gibi statik verilere karşılık gelmez, bu nedenle davranıştaki farklılık vardır, ancak yine de bir sunucudaki verilere değil, yerel bilgilere atıfta bulunurlar.
Jeremy

1
Hmm, kulağa doğru geliyor. Bu kafa karıştırıcı çünkü url gerçek ve kasıtlı görünüyor, ancak sadece bir yer tutucuysa, src'nin değerinin ne olduğu önemli olmamalı.
bhh1988

3
Bir Not allowed to navigate top frame to data URL: data:text/plain;base64,...hata alıyorum. Verileri alıyorum, ancak window.locationbuna izin verilmiyor ...
loretoparisi

15

blob url'sinden bir veri url'si oluşturmanın başka bir yolu da canvas kullanıyor olabilir.

var canvas = document.createElement("canvas")
var context = canvas.getContext("2d")
context.drawImage(img, 0, 0) // i assume that img.src is your blob url
var dataurl = canvas.toDataURL("your prefer type", your prefer quality)

mdn'de gördüğüm gibi canvas.toDataURL tarayıcılar tarafından iyi destekleniyor. (yani <9 hariç, her zaman yani <9)


17
Bunun elbette yalnızca görüntü verileri için geçerli olduğunu ve bazı meta verilerin kaybolabileceğini unutmayın!
minmaxavg

1
Bunu yapmak bir bağlantı oluşturur, ancak onu izlerseniz yalnızca bir kara kutu alırsınız.
Antfish

@Antfish, bu olmamalı değil mi?
Pacerier


0

Bu cevabı burada buldum ve kabul edilen cevaptan çok daha net göründüğü için referans vermek istedim:

function blobToDataURL(blob, callback) {
  var fileReader = new FileReader();
  fileReader.onload = function(e) {callback(e.target.result);}
  fileReader.readAsDataURL(blob);
}

-4

Önceki yanıtın söylediği gibi, onu chrome devtools panelinden görmeye çalışsanız bile, url'ye geri çözmenin bir yolu yoktur, url hala blob olarak kodlanmış olabilir.

Bununla birlikte, verileri elde etmek mümkündür, verileri elde etmenin bir başka yolu da verileri bir çapaya koymak ve doğrudan indirmektir.

<a href="blob:http://example.com/xxxx-xxxx-xxxx-xxxx" download>download</a>

Bunu blob url içeren sayfaya ekleyin ve butona tıklayın, içeriği alırsınız.

Başka bir yol, ajax çağrısını bir proxy sunucusu aracılığıyla durdurmaktır, o zaman gerçek görüntü url'sini görüntüleyebilirsiniz.


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx "download="abc.txt"> indirin </a>. İşe yaramalı. Href'e çarptığında, blob'u abc.txt olarak yeniden adlandıracak ve indirecek
P Satish Patro

2
Neden olumsuz oylar? dediğimi gerçekten denedin mi?
ospider

Ben olumsuz oy vermedim. Buraya geldim. Ve işe yarayacağını düşündüm. Bunu biraz destekliyorum
P Satish Patro

Olumsuz oylardan emin değilim, ancak bu kesinlikle basit bir yol gibi görünüyor. (Bununla birlikte Failed - Network error, Linux'ta her zaman Chrome 83.0.4103.97'ye giriyorum.)
toraritte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.