2013-02-19 32 views
58

Meine Seite generiert eine URL wie folgt: "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f" Wie kann ich sie in eine normale Adresse konvertieren?Blob-URL in normale URL konvertieren

Ich benutze es als 's src Attribut.

+1

sogar nach der Entschlüsselung der URL, es ist immer noch ein 'localhost' Link. Finde stattdessen den öffentlichen Link heraus. (welche CDN verwendest du?) – Raptor

+0

Ich möchte Javascript verwenden. – Jacob

+0

Verwenden Sie den [stackoverflow-Link] (http://stackoverflow.com/questions/332872/how-to-encode-a-url-in-javascript) .. und [W3C] (http://www.w3schools.com /jsref/tryit.asp?filename=tryjsref_decodeuricomponent) Ihr echtes Problem wird sein, wie Sie es unabhängig von der Umgebung machen können, in der Sie Ihren Code in – user1428716

Antwort

107

Eine URL, die aus einem JavaScript Blob erstellt wurde, kann nicht in eine "normale" URL konvertiert werden.

A blob: URL bezieht sich nicht auf Daten, die auf dem Server vorhanden sind, sondern bezieht sich auf Daten, die Ihr Browser momentan im Speicher für die aktuelle Seite hat. Es wird auf anderen Seiten nicht verfügbar sein, es wird nicht in anderen Browsern verfügbar sein, und es wird von anderen Computern nicht verfügbar sein.

Daher ist es im Allgemeinen nicht sinnvoll, eine Blob URL in eine "normale" URL zu konvertieren. Wenn Sie eine gewöhnliche URL wünschen, müssen Sie die Daten vom Browser an einen Server senden und ihn vom Server wie eine normale Datei verfügbar machen lassen.

Es ist möglich, eine blob: URL in eine data: URL zu konvertieren, zumindest in Chrome. Sie können eine AJAX-Anforderung verwenden, um die Daten von der URL blob: abzurufen (obwohl sie es nur aus dem Speicher Ihres Browsers herauszieht, ohne eine HTTP-Anforderung zu stellen).

Hier ist ein Beispiel:

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: URLs sind wahrscheinlich nicht, was Sie unter "normalen" bedeuten und kann in problematischer Weise groß sein. Sie funktionieren jedoch wie normale URLs, da sie gemeinsam genutzt werden können. Sie sind nicht spezifisch für den aktuellen Browser oder die aktuelle Sitzung.

+8

Wenn Blob-URLs nicht auf Server-Daten zeigen, wie sieht dann die Quell-URL von Youtube-Videos aus: src = "Blob: https% 3A // www.youtube.com/44f26667-03f1-4978-9eed-af0cbf11dd67 " (in Chrome) – bhh1988

+3

@ bhh1988 Das ist ein sehr interessanter Fund. Ich bin mir nicht sicher, was dort vor sich geht. Wenn ich versuche, ihre src-Blob-URL mithilfe eines XMLHttpRequest-Objekts abzurufen, wie in diesem Beitrag beschrieben, wird kein Inhalt zurückgegeben. Meine Vermutung ist, dass entweder (a) sie eine leere Blob-URL erzeugt haben, um sie als Platzhalter zu verwenden, während Daten von einer anderen Quelle eingegeben werden oder (b) der Blob irgendwie als Proxy für verschlüsselte Daten fungiert (via HTML5 Encrypted Media Extensions). Ich bin mir jedoch nicht sicher, wie beides in der Praxis tatsächlich durchgeführt werden könnte. –

+11

@ bhh1988 Es sieht aus wie die [media source extensions spec] (https: //dvcs.w3.org/hg/html-media/raw-datei/tip/media-source/media-source.html) können Blob-URLs für Medienströme erstellt werden, die von JavaScript verwaltet werden. Diese entsprechen nicht den statischen Daten wie den Blob-URLs, die in diesem Beitrag behandelt werden, daher der Unterschied im Verhalten, aber sie beziehen sich immer noch auf lokale Informationen und nicht direkt auf Daten auf einem Server. –

11

Eine andere Möglichkeit zum Erstellen einer Daten-URL aus der Blob-URL kann Canvas sein.

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) 

als was ich sah in mdn, Canvas.toDataURL wird von Browsern gut unterstützt. (außer ie < 9, immer also < 9)

+9

Beachten Sie, dass dies natürlich nur für Bilddaten gilt und einige Metadaten verloren gehen können! – minmaxavg

+0

Dadurch entsteht ein Link, aber wenn Sie ihm folgen, erhalten Sie nur eine Blackbox. – Antfish

+0

@Antfish, Das sollte nicht passieren, nicht wahr? – Pacerier

Verwandte Themen