blob: URLs
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
Blob- (oder Objekt-)URLs, URLs mit dem Präfix blob:
, ermöglichen die Integration von Blob
s und MediaSource
s mit anderen APIs, die nur für die Verwendung mit URLs entworfen wurden, wie etwa das <img>
-Element. Blob-URLs können auch verwendet werden, um zu navigieren sowie Downloads von lokal generierten Daten auszulösen. Sie sind als opake Bezeichner konzipiert (das heißt, Sie sollten sie nicht manuell schreiben) und sollten mit den Funktionen URL.createObjectURL()
und URL.revokeObjectURL()
verwaltet werden.
Blob-URLs sind ähnlich wie Data-URLs, da beide ermöglichen, im Speicher befindliche Ressourcen als URLs darzustellen; der Unterschied besteht darin, dass Data-URLs Ressourcen in sich selbst einbetten und strikte Größenbeschränkungen haben, während Blob-URLs ein unterstützendes Blob
oder MediaSource
erfordern und größere Ressourcen darstellen können.
Syntax
blob:<origin>/<uuid>
Nutzungshinweise
>Speicherverwaltung
Jedes Mal, wenn Sie createObjectURL()
aufrufen, wird eine neue Objekt-URL erstellt, selbst wenn Sie bereits eine für dasselbe Objekt erstellt haben. Jede davon muss durch Aufruf von URL.revokeObjectURL()
freigegeben werden, wenn Sie sie nicht mehr benötigen. Solange eine Objekt-URL aktiv ist, kann das zugrunde liegende Objekt nicht durch den Garbage Collector entfernt werden und könnte zu Speicherlecks führen.
Browser werden Objekt-URLs automatisch freigeben, wenn das Dokument entladen wird; jedoch sollten Sie, für optimale Leistung und Speichernutzung, wenn es sichere Zeitpunkte gibt, an denen Sie sie explizit entladen können, dies tun.
Dennoch sollten Sie vermeiden, die Objekt-URL zu früh freizugeben. Ein häufiges Anti-Muster ist das folgende:
const url = URL.createObjectURL(blob);
img.src = url;
img.addEventListener("load", () => {
URL.revokeObjectURL(url);
});
document.body.appendChild(img);
Das sofortige Widerrufen der Blob-URL, nachdem das Bild gerendert wurde, würde das Bild für Benutzerinteraktionen unbrauchbar machen (zum Beispiel, wenn man mit der rechten Maustaste klickt, um das Bild zu speichern oder in einem neuen Tab zu öffnen). Für langlebige Anwendungen sollten Sie Objekt-URLs nur widerrufen, wenn die Ressource für den Benutzer nicht mehr zugänglich ist (zum Beispiel, wenn das Bild aus dem DOM entfernt wird).
Speicherpartitionierung
Der Zugriff auf Ressourcen über Blob-URLs unterliegt denselben Einschränkungen wie alle anderen Speichermethoden, das heißt, Statuspartitionierung. Blob-URLs haben einen zugeordneten Ersteller-Ursprung (der in der URL selbst gespeichert ist) und können nur aus Umgebungen abgerufen werden, in denen der Speicher-Schlüssel mit dem der Erstellungsumgebung übereinstimmt. Blob-URL-Navigierungen unterliegen nicht dieser Einschränkung, obwohl Browser möglicherweise Datenschutzmaßnahmen wie noopener
für Cross-Site-Navigierungen zu einer Blob-URL durchsetzen.
Verwendung von Objekt-URLs für Medienstreams
In älteren Versionen der Media Source-Spezifikation erforderte das Anhängen eines Streams an ein <video>
-Element das Erstellen einer Objekt-URL für den MediaStream
. Dies ist nicht mehr notwendig, und Browser entfernen die Unterstützung dafür.
Warnung:
Wenn Sie noch Code haben, der auf createObjectURL()
angewiesen ist, um Streams an Media-Elemente anzuhängen, müssen Sie Ihren Code aktualisieren, um srcObject
direkt auf den MediaStream
einzustellen.
Abrufen mit dem Range-Header
Blob-URLs unterstützen das Abrufen mit dem Range
-Header, um Teilinhalte anzufordern. Dies ist besonders nützlich beim Arbeiten mit großen Blobs, da es Ihnen ermöglicht, nur die notwendigen Teile des Blobs abzurufen, anstatt den gesamten Inhalt. Für ein Beispiel siehe Abrufen eines Bereichs von einer Blob-URL.
Beispiele
>Gültige Blob-URLs
blob:https://example.org/40a5fb5a-d56d-4a33-b4e2-0acf6a8e5f64
Erstellen von Blob-URLs
In diesem Beispiel erstellen wir zuerst ein Blob
von einem <canvas>
, erstellen eine Blob-URL dazu und hängen schließlich die URL an ein <img>
-Element an.
const canvas = document.querySelector("canvas");
canvas.toBlob((blob) => {
const img = document.createElement("img");
img.src = URL.createObjectURL(blob);
document.body.appendChild(img);
});
Spezifikationen
Specification |
---|
File API> # url> |
Browser-Kompatibilität
Loading…