2013-02-19 18 views
58

La mia pagina genera un URL come questo: "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f" Come posso convertirlo in un indirizzo normale?Converti blob URL nell'URL normale

Lo sto utilizzando come attributo <img>src.

+1

anche dopo la decodifica dell'URL, è ancora un collegamento 'localhost'. Scopri il suo link pubblico, invece. (quale CDN stai usando?) – Raptor

+0

Sto desiderando usare javascript. – Jacob

+0

Utilizzare il [collegamento stackvoverflow] (http://stackoverflow.com/questions/332872/how-to-encode-a-url-in-javascript) .. e [W3C] (http://www.w3schools.com) /jsref/tryit.asp?filename=tryjsref_decodeuricomponent) Il tuo vero problema sarà come renderlo indipendente dall'ambiente in cui implementi il ​​tuo codice in – user1428716

risposta

107

Un URL creato da un JavaScript Blob non può essere convertito in un URL "normale".

A blob: L'URL non fa riferimento ai dati esistenti sul server, fa riferimento ai dati attualmente disponibili nel browser per la pagina corrente. Non sarà disponibile su altre pagine, non sarà disponibile in altri browser e non sarà disponibile da altri computer.

Pertanto, non ha senso, in generale, convertire un URL Blob in un URL "normale". Se si desidera un URL normale, è necessario inviare i dati dal browser a un server e fare in modo che il server lo renda disponibile come un normale file.

È possibile convertire un URL blob: in un URL data:, almeno in Chrome. È possibile utilizzare una richiesta AJAX per "prelevare" i dati dall'URL blob: (anche se in realtà è sufficiente estrarlo dalla memoria del browser, non effettuare una richiesta HTTP).

Ecco un esempio:

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 non sono probabilmente ciò che si intende per "normale" e può essere problematico di grandi dimensioni. Tuttavia funzionano come normali URL in quanto possono essere condivisi; non sono specifici per il browser o la sessione corrente.

+8

Se gli URL blob non puntano ai dati del server, allora come mai l'URL src dei video di YouTube è simile a: src = "blob: https% 3A // www.youtube.com/44f26667-03f1-4978-9eed-af0cbf11dd67 " (in Chrome) – bhh1988

+3

@ bhh1988 Questa è una scoperta molto interessante. Non sono sicuro di cosa sta succedendo lì. Se provo a recuperare il loro URL blob src utilizzando un XMLHttpRequest, come descritto in questo post, non viene restituito alcun contenuto. La mia ipotesi è che (a) hanno generato qualsiasi URL di Blob vuoto da utilizzare come segnaposto mentre si alimentano dati da un'altra fonte o (b) il Blob agisce in qualche modo come un proxy per i dati crittografati (tramite HTML5 Encrypted Media Extensions). Tuttavia, non sono sicuro di come uno di questi potrebbe effettivamente essere fatto in pratica. –

+11

@ bhh1988 Sembra la [specifica estensioni sorgenti multimediali] (https: //dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html) consente di creare URL blob per i flussi multimediali gestiti da JavaScript. Questi non corrispondono a dati statici come gli URL blob discussi in questo post, quindi la differenza di comportamento, ma si riferiscono ancora a informazioni locali, non direttamente ai dati su un server. –

11

un altro modo per creare un URL di dati da blob url può essere l'utilizzo di canvas.

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) 

come quello che ho visto in MDN, canvas.toDataURL è supportato anche dai browser. (ad eccezione, ad esempio, < 9, sempre <)

+9

Si noti che questo ovviamente si applica solo ai dati di immagine e alcuni metadati potrebbero andare persi! – minmaxavg

+0

Questo crea un collegamento, ma se lo segui ottieni solo una scatola nera. – Antfish

+0

@Antfish, Non dovrebbe succedere, vero? – Pacerier