Converti l'URL del BLOB in un URL normale


95

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?

Sto usando come un <img>'s srcattributo.


1
anche dopo aver decodificato l'URL, è ancora un localhostcollegamento. Scopri invece il suo collegamento pubblico. (quale CDN stai usando?)
Raptor

Desidero utilizzare javascript.
Jacob,

Usa il link stackvoverflow .. e W3C Il tuo vero problema sarà come renderlo indipendente dall'ambiente in cui distribuisci il tuo codice
user1428716

C'è un modo per trovare l'URL pubblico dall'indirizzo del blob. Questo è l'unico valore che ho.
Jacob,

Risposte:


163

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

Un blob:URL non si riferisce ai dati esistenti sul server, si riferisce ai dati che il tuo browser ha attualmente in memoria, per la pagina corrente. Non sarà disponibile su altre pagine, non sarà disponibile in altri browser e non sarà disponibile da altri computer.

Quindi non ha senso, in generale, convertire un BlobURL in un URL "normale". Se volessi un URL normale, dovresti 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 blob:URL in un data:URL, almeno in Chrome. È possibile utilizzare una richiesta AJAX per "recuperare" i dati blob:dall'URL (anche se in realtà li estrae solo dalla memoria del browser, non effettua 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:Gli URL probabilmente non sono ciò che intendi per "normale" e possono essere problematicamente grandi. Tuttavia funzionano come normali URL in quanto possono essere condivisi; non sono specifici per il browser o la sessione corrente.


14
Se gli URL BLOB non puntano ai dati del server, allora come mai l'URL src dei video di Youtube ha il seguente aspetto: src = "blob: https% 3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67" (in Chrome)
bhh1988

5
@ bhh1988 Questa è una scoperta molto interessante. Non sono sicuro di cosa stia 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) abbiano generato qualsiasi URL Blob vuoto da utilizzare come segnaposto mentre alimenta i dati da un'altra fonte o (b) il Blob in qualche modo funge da proxy per i dati crittografati (tramite HTML5 Encrypted Media Extensions). Tuttavia, non sono sicuro di come uno di questi possa essere effettivamente fatto nella pratica.
Black Lives Matter

19
@ bhh1988 Sembra che la specifica delle estensioni dell'origine multimediale consenta la creazione di URL BLOB per i flussi multimediali gestiti da JavaScript. Questi non corrispondono a dati statici come gli URL BLOB discussi in questo post, da qui la differenza di comportamento, ma si riferiscono comunque a informazioni locali, non direttamente a dati su un server.
Black Lives Matter,

1
Hmm, suona bene. È fonte di confusione perché l'URL sembra reale e intenzionale, ma se è solo un segnaposto non dovrebbe importare quale sia il valore di src.
bhh1988

3
Ottengo un Not allowed to navigate top frame to data URL: data:text/plain;base64,...errore. Ho i dati, ma window.locationnon è consentito ...
loretoparisi

15

un altro modo per creare un URL di dati dall'URL del blob potrebbe 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 bene dai browser. (eccetto ie <9, sempre ie <9)


17
Nota che questo ovviamente vale solo per i dati di immagine e alcuni metadati potrebbero andare persi!
minmaxavg

1
In questo modo si crea un collegamento ma se lo si segue si ottiene solo una scatola nera.
Antfish

@ Formica, non dovrebbe succedere, vero?
Pacerier


-5

Come ha detto la risposta precedente, non c'è modo di decodificarlo come URL, anche quando provi a vederlo dal pannello Chrome devtools, l'URL potrebbe essere ancora codificato come blob.

Tuttavia, è possibile ottenere i dati, un altro modo per ottenere i dati è metterli in un ancoraggio e scaricarli direttamente.

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

Inseriscilo nella pagina contenente l'URL del blob e fai clic sul pulsante, ottieni il contenuto.

Un altro modo è intercettare la chiamata ajax tramite un server proxy, quindi è possibile visualizzare il vero URL dell'immagine.


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx "download="abc.txt"> download </a>. Dovrebbe funzionare. Quando colpirà l'href, rinominerà il blob in abc.txt e scaricherà
P Satish Patro

1
Perché i voti negativi? hai davvero provato quello che ho detto?
Ospider

Non ho svalutato. Sono venuto qui. E ho pensato che funzionerà. Sono a favore di questo un po '
P Satish Patro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.