2013-02-19 12 views
58

Moja strona generuje następujący adres URL: "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f" Jak mogę przekonwertować go na zwykły adres?Konwersja adresu URL blobu na zwykły URL

Używam go jako atrybutu 'src.

+1

nawet po odkodowaniu adresu URL, nadal jest linkiem 'localhost'. Zamiast tego dowiedz się, jaki jest jej publiczny link. (którego CDN używasz?) – Raptor

+0

Chciałbym używać javascript. – Jacob

+0

Skorzystaj z [powiązania przepływu stosu] (http://stackoverflow.com/questions/332872/how-to-encode-a-url-in-javascript) .. i [W3C] (http://www.w3schools.com /jsref/tryit.asp?filename=tryjsref_decodeuricomponent) Twoim prawdziwym problemem będzie to, jak uniezależnić go od środowiska, w którym twój kod zostanie wdrożony: – user1428716

Odpowiedz

107

Adres URL utworzony na podstawie kodu JavaScript Blob nie może zostać przekonwertowany na "normalny" adres URL.

Adres URL nie odnosi się do danych, które istnieją na serwerze, dotyczy danych, które przeglądarka ma aktualnie w pamięci dla bieżącej strony. Nie będzie dostępny na innych stronach, nie będzie dostępny w innych przeglądarkach i nie będzie dostępny na innych komputerach.

Dlatego ogólnie nie ma sensu przekształcanie adresu URL z adresu URL na "zwykły" adres URL na Blob. Jeśli chcesz mieć zwykły adres URL, musisz przesłać dane z przeglądarki do serwera i udostępnić serwer jak zwykły plik.

Możliwe jest przekształcenie adresu URL blob: w adres URL data:, przynajmniej w Chrome. Możesz użyć żądania AJAX, aby "pobrać" dane z adresu URL blob: (chociaż tak naprawdę to tylko wyciągnięcie go z pamięci przeglądarki, bez wysyłania żądania HTTP).

Oto przykład:

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: adresy URL nie są prawdopodobnie co masz na myśli przez "normalne" i może być problematycznie duża. Jednak działają tak, jak zwykłe adresy URL, dzięki czemu można je udostępniać; nie są one specyficzne dla bieżącej przeglądarki lub sesji.

+8

Jeśli adresy URL obiektów blob nie wskazują danych serwera, to jak wygląda adres URL src z YouTube: src = "blob: https% 3A // www.youtube.com/44f26667-03f1-4978-9eed-af0cbf11dd67 " (w Chrome) – bhh1988

+3

@ bhh1988 To bardzo interesujące znalezisko. Nie jestem pewien, co się tam dzieje. Jeśli spróbuję pobrać ich adres URL blobu src za pomocą XMLHttpRequest, jak opisano w tym poście, żadna treść nie jest zwracana. Domyślam się, że albo (a) wygenerowali pusty adres URL Bloba, który będzie używany jako symbol zastępczy podczas podawania danych z innego źródła, lub (b) Blob w jakiś sposób działa jako serwer proxy dla zaszyfrowanych danych (przez rozszerzenia HTML5 Encrypted Media Extensions). Jednak nie jestem pewien, jak można to zrobić w praktyce. –

+11

@ bhh1988 Wygląda jak [specyfikacja rozszerzenia źródła mediów] (https: //dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html) umożliwia tworzenie adresów URL typu blob dla strumieni multimediów zarządzanych przez JavaScript. Nie odpowiadają one statycznym danym, takim jak adresy URL obiektów blob omawianych w tym poście, stąd różnica w zachowaniu, ale nadal odnoszą się do lokalnych informacji, a nie bezpośrednio do danych na serwerze. –

11

Innym sposobem na utworzenie adresu URL danych z adresu URL blob może być użycie obszaru roboczego.

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) 

jak to, co widziałem w mdn, canvas.toDataURL jest obsługiwany również przez przeglądarki. (z wyjątkiem np. < 9, zawsze tj. < 9)

+9

Należy zauważyć, że dotyczy to oczywiście danych obrazu, a niektóre metadane mogą zostać utracone! – minmaxavg

+0

W ten sposób tworzy się link, ale jeśli go użyjesz, dostaniesz tylko czarne pole. – Antfish

+0

@Antfish, To nie powinno się zdarzyć, prawda? – Pacerier