2013-02-19 264 views
58

我的頁面生成如下URL:"blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f"如何將其轉換爲普通地址?將blob URL轉換爲普通URL

我使用它作爲<img>src屬性。

+1

甚至在解碼URL之後,它仍然是一個「localhost」鏈接。找出它的公共鏈接。 (您使用的是CDN?) – Raptor 2013-02-19 07:33:39

+0

我希望使用javascript。 – Jacob 2013-02-19 07:38:35

+0

使用[stackvoverflow鏈接](http://stackoverflow.com/questions/332872/how-to-encode-a-url-in-javascript)..和[W3C](http://www.w3schools.com /jsref/tryit.asp?filename=tryjsref_decodeuricomponent)你真正的問題將是如何使它獨立於你部署代碼的環境 – user1428716 2013-02-19 07:42:39

回答

107

從JavaScript Blob創建的URL無法轉換爲「正常」URL。

A blob: URL並不是指服務器上存在的數據,而是指您的瀏覽器當前在內存中爲當前頁面提供的數據。它在其他頁面上不可用,在其他瀏覽器中不可用,並且不能從其他計算機上使用。

因此,通常將Blob URL轉換爲「普通」URL是沒有意義的。如果你想要一個普通的URL,你將不得不將數據從瀏覽器發送到服務器,並讓服務器像普通文件一樣使用它。

至少在Chrome中,可以將blob: URL轉換爲data: URL。您可以使用AJAX請求從blob: URL中「獲取」數據(即使它真的只是將其從瀏覽器的內存中取出,而不是發出HTTP請求)。

下面是一個例子:

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一樣工作,因爲他們可以共享;它們並不特定於當前的瀏覽器或會話。

+8

如果blob網址沒有指向服務器數據,那麼Youtube視頻的src網址如何顯示: src =「blob:https%3A // www.youtube.com/44f26667-03f1-4978-9eed-af0cbf11dd67「 (在Chrome中) – bhh1988 2014-09-03 15:53:12

+3

@ bhh1988這是一個非常有趣的發現。我不確定那裏發生了什麼。如果我嘗試使用XMLHttpRequest檢索其src Blob URL,如本文中所述,則不會返回任何內容。我的猜測是(a)他們生成任何空的Blob URL作爲佔位符,同時從另一個源提供數據,或者(b)Blob以某種方式充當加密數據的代理(通過HTML5加密媒體擴展)。但是,我不確定這些在實際中如何實際上可以做到。 – 2014-09-03 16:11:56

+11

@ bhh1988它看起來像[媒體源擴展規範](https://dvcs.w3。org/hg/html-media/raw-file/tip/media-source/media-source.html)允許爲由JavaScript管理的媒體流創建blob URL。這些對象不像本文討論的blob URL那樣的靜態數據,因此在行爲上有所不同,但它們仍然是指本地信息,而不是直接指向服務器上的數據。 – 2014-09-11 01:33:13

11

另一種從blob url創建數據url的方式可能是使用畫布。

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中所看到的,canvas.toDataURL得到了瀏覽器的支持。 (除了<9,總是<9)

+9

請注意,這當然只適用於圖像數據,一些元數據可能會丟失! – minmaxavg 2016-05-25 09:32:02

+0

這樣做會創建一個鏈接,但如果你遵循它,你只會得到一個黑盒子。 – Antfish 2017-01-30 10:15:15

+0

@Antfish,這不應該發生不是嗎? – Pacerier 2017-02-06 21:49:02