JavaScript/URL/createObjectURL: Unterschied zwischen den Versionen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche
(7 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Die Methode '''URL.createObjectURL''' erzeugt einen URL mit dem Schema "blob:", der das Objekt repräsentiert, das als Parameter übergeben wurde. Im Gegensatz zu einem [[Data-URL]] enthält ein Blob-URL nicht das vollständige Objekt in codierter Form, sondern lediglich eine Referenz auf das Objekt. Das Objekt selbst befindet sich (削除) lediglich (削除ここまで)im Speicher des Browsers.
+
Die Methode '''URL.createObjectURL''' erzeugt einen URL mit dem Schema "blob:", der das Objekt repräsentiert, das als Parameter übergeben wurde. Im Gegensatz zu einem [[Data-URL]] enthält ein Blob-URL nicht das vollständige Objekt in codierter Form, sondern lediglich eine Referenz auf das Objekt. Das Objekt selbst befindet sich im Speicher des Browsers.
{{(削除) Iconset|meta|chr|fx|ie10|op|saf (削除ここまで)|(削除) caniuse= (削除ここまで)createobjecturl}}
+
{{(追記) caniuse (追記ここまで)|createobjecturl}}
   
 
Sie können Blob-URLs verwenden, um ein Datenobjekt im Arbeitsspeicher aufzubauen und es dann - ähnlich wie bei einer Data-URL - dem User über einen Link zum Download anzubieten. Da eine Blob-URL nur eine Referenz darstellt, entfällt hier die Umwandlung in einen base64-codierten String, was bei großen Objekten lohnend sein kann.
 
Sie können Blob-URLs verwenden, um ein Datenobjekt im Arbeitsspeicher aufzubauen und es dann - ähnlich wie bei einer Data-URL - dem User über einen Link zum Download anzubieten. Da eine Blob-URL nur eine Referenz darstellt, entfällt hier die Umwandlung in einen base64-codierten String, was bei großen Objekten lohnend sein kann.
Zeile 6: Zeile 6:
 
Das MediaStream API hat in einer früheren Version Blob-URLs vorausgesetzt, um die Datenquelle anzugeben. Das ist in aktuellen Browsern nicht mehr erforderlich, und die Browserhersteller entfernen die Unterstützung dafür.
 
Das MediaStream API hat in einer früheren Version Blob-URLs vorausgesetzt, um die Datenquelle anzugeben. Das ist in aktuellen Browsern nicht mehr erforderlich, und die Browserhersteller entfernen die Unterstützung dafür.
   
(削除) ''' (削除ここまで)Syntax(削除) ''' (削除ここまで)
+
(追記) {|class="wikitable reference" style="width:100%" (追記ここまで)
  +
(追記) !style="width:6em"| (追記ここまで)Syntax
  +
(追記) |colspan="2"|<code>objektUrl = URL.createObjectURL(objekt);</code> (追記ここまで)
  +
(追記) |- (追記ここまで)
  +
(追記) !&nbsp;&nbsp;&nbsp;Parameter (追記ここまで)
  +
(追記) |<code>objekt</code> (追記ここまで)
  +
(追記) |Ein [[JavaScript/File|File]], [[JavaScript/Blob|Blob]] oder MediaSource-Objekt. (追記ここまで)
  +
(追記) |- (追記ここまで)
  +
(追記) !&nbsp;&nbsp;&nbsp;Rückgabe (追記ここまで)
  +
(追記) |<code>objektUrl</code> (追記ここまで)
  +
(追記) |Ein String, der die Objekt-URL enthält, mit der sich das angegebene Objekt ansprechen lässt (追記ここまで)
  +
(追記) |} (追記ここまで)
   
(削除) <code>blobUrl = URL.createObjectURL(objekt);</code> (削除ここまで)
 
   
(削除) * <code>objekt</code>: Ein (削除ここまで)[[(削除) JavaScript/File (削除ここまで)|(削除) File (削除ここまで)]], [[JavaScript/(削除) Blob (削除ここまで)|(削除) Blob (削除ここまで)]] (削除) oder MediaSource-Objekt (削除ここまで).
+
(追記) {{Beachten|Eine Objekt-URL enthält eine Referenz auf das angegebene Objekt und sorgt damit dafür, dass dieses Objekt vom Garbage Collector nicht freigegeben werden kann. Wenn die aktuelle Seite verlassen wird, werden zwar alle Ressourcen freigegeben, aber wenn Sie eine (追記ここまで)[[(追記) OnePager (追記ここまで)|(追記) Single-Page Webseite (追記ここまで)]] (追記) erstellen (追記ここまで), (追記) müssen Sie selbst darauf achten, dass nicht mehr genutzte Objekt-URLs wieder freigegeben werden, um Speicherlecks zu vermeiden. Dazu dient die Methode (追記ここまで)[[JavaScript/(追記) URL/revokeObjectURL (追記ここまで)|(追記) <code>revokeObjectURL</code> (追記ここまで)]].(追記) }} (追記ここまで)
   
(削除) * <code>blobUrl</code> (削除ここまで): (削除) Ein String, der die Objekt (削除ここまで)-(削除) URL enthält, mit der sich das angegebene Objekt ansprechen lässt. (削除ここまで)
+
(追記) == Beispiel (追記ここまで): (追記) Bereitstellen eines BLOB als Download (追記ここまで)-(追記) Link == (追記ここまで)
   
  +
(追記) Das folgende Beispiel verwendet <code>URL.createObjectURL</code>, um den Inhalt eines [[JavaScript/Blob|Blob-Objekts]] zum Download anzubieten. Für das Beispiel wird lediglich ein Blob mit einfachem Textinhalt verwendet, der aus einem Eingabefeld bestückt wird. Genauso gut könnte ein Blob aus generierten oder vom Server geladenen Daten erstellt werden. (追記ここまで)
   
{{(削除) Beachten (削除ここまで)|(削除) Eine Objekt-URL enthält eine Referenz auf das angegebene Objekt und sorgt damit dafür, dass dieses Objekt vom Garbage Collector nicht freigegeben werden kann. Wenn die aktuelle Seite verlassen wird, werden zwar alle Ressourcen freigegeben, aber wenn Sie eine [[ (削除ここまで)HTML(削除) /Tutorials/Single-Page_Webseite (削除ここまで)|(削除) Single-Page Webseite]] erstellen, müssen Sie selbst darauf achten, dass nicht mehr genutzte Objekt-URLs wieder freigegeben werden, um Speicherlecks zu vermeiden. Dazu dient die Methode [[JavaScript/URL/revokeObjectURL (削除ここまで)|<(削除) code (削除ここまで)>(削除) revokeObjectURL (削除ここまで)</(削除) code (削除ここまで)>(削除) ]].}} (削除ここまで)
+
{{(追記) Beispiel (追記ここまで)|(追記) titel= (追記ここまで)HTML|
  +
(追記) {{BeispielCode (追記ここまで)|
  +
(追記) <syntaxhighlight lang="html"> (追記ここまで)
  +
<(追記) h1 (追記ここまで)>(追記) Beispiel createObjectURL() (追記ここまで)</(追記) h1 (追記ここまで)>
   
(削除) {{ToDo (削除ここまで)|(削除) Beispiel erstellen - (削除ここまで)-[[(削除) Benutzer:Rolf b (削除ここまで)|(削除) Rolf b (削除ここまで)]] ([[(削除) Benutzer Diskussion:Rolf b (削除ここまで)|(削除) Diskussion (削除ここまで)]]) (削除) 20 (削除ここまで):(削除) 17 (削除ここまで), (削除) 6 (削除ここまで). (削除) Mai 2021 (削除ここまで)((削除) CEST (削除ここまで)).}}
+
(追記) <form id="url_form"> (追記ここまで)
  +
(追記)   <label for="input_text">Inhalt: </label> (追記ここまで)
  +
(追記)   <textarea id="input_text" width="80" height="25">Hallo Welt!</textarea> (追記ここまで)
  +
(追記)   <label for="input_type">MIME-Typ: </label> (追記ここまで)
  +
(追記)   <input type="text" id="input_type" list="mime" /> (追記ここまで)
  +
(追記)   <label for="input_name">Vorgeschlagener Dateiname: </label> (追記ここまで)
  +
(追記)   <input type="text" id="input_name" value="test.txt" /> (追記ここまで)
  +
(追記)   <datalist id="mime"> (追記ここまで)
  +
(追記)     <option value="text/css" /> (追記ここまで)
  +
(追記)     <option value="text/html" /> (追記ここまで)
  +
(追記)     <option value="image/svg+xml" /> (追記ここまで)
  +
(追記)     <option value="text/plain" /> (追記ここまで)
  +
(追記)   </datalist> (追記ここまで)
  +
(追記)   <button id="generate">Download-URL generieren</button> (追記ここまで)
  +
(追記)   <a hidden download="" id="download">Noch nichts</a> (追記ここまで)
  +
(追記) </form> (追記ここまで)
  +
(追記) </syntaxhighlight> (追記ここまで)
  +
(追記) }}}} (追記ここまで)
  +
 
  +
(追記) Das Beispiel verwendet eine [[textarea (追記ここまで)|(追記) Textarea]] zur Eingabe des Blob (追記ここまで)-(追記) Inhalts. Hinzu kommt ein (追記ここまで)[[(追記) HTML/Elemente/input (追記ここまで)|(追記) Text-Eingabefeld (追記ここまで)]](追記) , um einen Dateinamen für den Downloadlink vorzugeben, sowie ein Text-Eingabefeld für den MIME-Typ (追記ここまで)((追記) unterstützt durch eine (追記ここまで)[[(追記) datalist (追記ここまで)|(追記) Datalist (追記ここまで)]])(追記) . (追記ここまで)
  +
 
  +
(追記) Hinzu kommt ein Submit-Button für das Eingabeformular, den wir mit JavaScript behandeln werden, sowie ein - zunächst verstecktes - [[HTML/Elemente/a|a-Element]], für das das download-Attribut gesetzt ist, um beim Anklicken einen Download zu erzwingen. (追記ここまで)
  +
 
  +
(追記) Das JavaScript für den Submit-Button sieht so aus: (追記ここまで)
  +
 
  +
(追記) {{Beispiel|titel=JavaScript|zeige=Beispiel (追記ここまで):(追記) create-object-url.html| (追記ここまで)
  +
(追記) {{BeispielCode| (追記ここまで)
  +
(追記) <syntaxhighlight lang="js"> (追記ここまで)
  +
(追記) // Funktion zum Generieren der URL (追記ここまで)
  +
(追記) function generateURL() { (追記ここまで)
  +
(追記)   var link = document.getElementById("download"); (追記ここまで)
  +
(追記)   // Falls Link bereits vorhanden, Speicherleck vermeiden (追記ここまで)
  +
(追記)   if (link.href) { (追記ここまで)
  +
(追記)     URL.revokeObjectURL(link.href); (追記ここまで)
  +
(追記)   } (追記ここまで)
  +
 
  +
(追記)   // Input-Felder auslesen (追記ここまで)
  +
(追記)   var inputText = document.getElementById("input_text").value; (追記ここまで)
  +
(追記)   var inputType = document.getElementById("input_type").value; (追記ここまで)
  +
(追記)   var inputName = document.getElementById("input_name").value; (追記ここまで)
  +
 
  +
(追記)   // Binary Large OBject (BLOB) erstellen (追記ここまで)
  +
(追記)   var blob = new Blob([inputText] (追記ここまで), (追記) { (追記ここまで)
  +
(追記)     type: inputType (追記ここまで)
  +
(追記)   }); (追記ここまで)
  +
 
  +
(追記)   // Alles auf den Link schmeißen (追記ここまで)
  +
(追記)   link (追記ここまで).(追記) href = URL.createObjectURL(blob); (追記ここまで)
  +
(追記)   link.download = inputName; (追記ここまで)
  +
(追記)   link.textContent = "'" + inputName + "' herunterladen"; (追記ここまで)
  +
(追記)   link.hidden = false; (追記ここまで)
  +
(追記) } (追記ここまで)
  +
 
  +
(追記) // Event-Listener (追記ここまで)
  +
(追記) document.getElementById (追記ここまで)((追記) "url_form" (追記ここまで)).(追記) addEventListener("submit", function (submitEvent) { (追記ここまで)
  +
(追記)   submitEvent.preventDefault(); (追記ここまで)
  +
(追記)   generateURL(); (追記ここまで)
  +
(追記) } (追記ここまで)
  +
(追記) </syntaxhighlight> (追記ここまで)
  +
}}
  +
(追記) }} (追記ここまで)
  +
 
  +
(追記) Das Script bindet eine anonyme Funktion an das <code>submit</code>-Event (das beim Absenden des Formulars ausgelöst wird). Diese Funktion stoppt zunächst mit [[JavaScript/DOM/Event/preventDefault|preventDefault]] das normale Browserverhalten, die Formulardaten an den Server zu senden, und ruft dann die lokale Verarbeitung in der Funktion <code>generateURL</code> auf. (追記ここまで)
  +
 
  +
(追記) In <code>generateURL()</code> wird zunächst das Element für den Downloadlink ermittelt und geprüft, ob das <code>href</code>-Attribut bereits gesetzt ist. Wenn ja, erfolgt der Script-Aufruf nicht zum ersten Mal und es ist zwingend erforderlich, den existierenden URL zunächst mit <code>URL.revokeObjectURL()</code> freizugeben, um ein Speicherleck zu vermeiden. (追記ここまで)
  +
 
  +
(追記) Danach werden alle Eingabefelder ausgelesen und aus Texteingabe und MIME-Typ ein '''B'''inary '''L'''arge '''OB'''ject ('''BLOB''') erstellt. Für diesen Blob wird mittels <code>URL.createObjectURL</code> ein Objekt-URL erstellt und im <code>href</code>-Attribut des Links gespeichert. Danach wird der eingegeben Wunsch-Dateiname über das <code>download</code>-Attribut bereitgestellt und der Link sichtbar gemacht. (追記ここまで)
   
 
== Weblinks ==
 
== Weblinks ==

Aktuelle Version vom 24. Januar 2025, 00:35 Uhr

Die Methode URL.createObjectURL erzeugt einen URL mit dem Schema "blob:", der das Objekt repräsentiert, das als Parameter übergeben wurde. Im Gegensatz zu einem Data-URL enthält ein Blob-URL nicht das vollständige Objekt in codierter Form, sondern lediglich eine Referenz auf das Objekt. Das Objekt selbst befindet sich im Speicher des Browsers.

Browserunterstützung
caniuse.com

Sie können Blob-URLs verwenden, um ein Datenobjekt im Arbeitsspeicher aufzubauen und es dann - ähnlich wie bei einer Data-URL - dem User über einen Link zum Download anzubieten. Da eine Blob-URL nur eine Referenz darstellt, entfällt hier die Umwandlung in einen base64-codierten String, was bei großen Objekten lohnend sein kann.

Das MediaStream API hat in einer früheren Version Blob-URLs vorausgesetzt, um die Datenquelle anzugeben. Das ist in aktuellen Browsern nicht mehr erforderlich, und die Browserhersteller entfernen die Unterstützung dafür.

Syntax objektUrl = URL.createObjectURL(objekt);
   Parameter objekt Ein File, Blob oder MediaSource-Objekt.
   Rückgabe objektUrl Ein String, der die Objekt-URL enthält, mit der sich das angegebene Objekt ansprechen lässt


Beachten Sie: Eine Objekt-URL enthält eine Referenz auf das angegebene Objekt und sorgt damit dafür, dass dieses Objekt vom Garbage Collector nicht freigegeben werden kann. Wenn die aktuelle Seite verlassen wird, werden zwar alle Ressourcen freigegeben, aber wenn Sie eine Single-Page Webseite erstellen, müssen Sie selbst darauf achten, dass nicht mehr genutzte Objekt-URLs wieder freigegeben werden, um Speicherlecks zu vermeiden. Dazu dient die Methode revokeObjectURL.

Beispiel: Bereitstellen eines BLOB als Download-Link

Das folgende Beispiel verwendet URL.createObjectURL, um den Inhalt eines Blob-Objekts zum Download anzubieten. Für das Beispiel wird lediglich ein Blob mit einfachem Textinhalt verwendet, der aus einem Eingabefeld bestückt wird. Genauso gut könnte ein Blob aus generierten oder vom Server geladenen Daten erstellt werden.

HTML
<h1>Beispiel createObjectURL()</h1>
<form id="url_form">
 <label for="input_text">Inhalt: </label>
 <textarea id="input_text" width="80" height="25">Hallo Welt!</textarea>
 <label for="input_type">MIME-Typ: </label>
 <input type="text" id="input_type" list="mime" />
 <label for="input_name">Vorgeschlagener Dateiname: </label>
 <input type="text" id="input_name" value="test.txt" />
 <datalist id="mime">
 <option value="text/css" />
 <option value="text/html" />
 <option value="image/svg+xml" />
 <option value="text/plain" />
 </datalist>
 <button id="generate">Download-URL generieren</button>
 <a hidden download="" id="download">Noch nichts</a>
</form>

Das Beispiel verwendet eine Textarea zur Eingabe des Blob-Inhalts. Hinzu kommt ein Text-Eingabefeld, um einen Dateinamen für den Downloadlink vorzugeben, sowie ein Text-Eingabefeld für den MIME-Typ (unterstützt durch eine Datalist).

Hinzu kommt ein Submit-Button für das Eingabeformular, den wir mit JavaScript behandeln werden, sowie ein - zunächst verstecktes - a-Element, für das das download-Attribut gesetzt ist, um beim Anklicken einen Download zu erzwingen.

Das JavaScript für den Submit-Button sieht so aus:

JavaScript ansehen ...
// Funktion zum Generieren der URL
function generateURL() {
 var link = document.getElementById("download");
 // Falls Link bereits vorhanden, Speicherleck vermeiden
 if (link.href) {
 URL.revokeObjectURL(link.href);
 }
 // Input-Felder auslesen
 var inputText = document.getElementById("input_text").value;
 var inputType = document.getElementById("input_type").value;
 var inputName = document.getElementById("input_name").value;
 // Binary Large OBject (BLOB) erstellen
 var blob = new Blob([inputText], {
 type: inputType
 });
 // Alles auf den Link schmeißen
 link.href = URL.createObjectURL(blob);
 link.download = inputName;
 link.textContent = "'" + inputName + "' herunterladen";
 link.hidden = false;
}
// Event-Listener
document.getElementById("url_form").addEventListener("submit", function (submitEvent) {
 submitEvent.preventDefault();
 generateURL();
}

Das Script bindet eine anonyme Funktion an das submit-Event (das beim Absenden des Formulars ausgelöst wird). Diese Funktion stoppt zunächst mit preventDefault das normale Browserverhalten, die Formulardaten an den Server zu senden, und ruft dann die lokale Verarbeitung in der Funktion generateURL auf.

In generateURL() wird zunächst das Element für den Downloadlink ermittelt und geprüft, ob das href-Attribut bereits gesetzt ist. Wenn ja, erfolgt der Script-Aufruf nicht zum ersten Mal und es ist zwingend erforderlich, den existierenden URL zunächst mit URL.revokeObjectURL() freizugeben, um ein Speicherleck zu vermeiden.

Danach werden alle Eingabefelder ausgelesen und aus Texteingabe und MIME-Typ ein Binary Large OBject (BLOB) erstellt. Für diesen Blob wird mittels URL.createObjectURL ein Objekt-URL erstellt und im href-Attribut des Links gespeichert. Danach wird der eingegeben Wunsch-Dateiname über das download-Attribut bereitgestellt und der Link sichtbar gemacht.

Weblinks


Abgerufen am 6.10.2025
von "http://wiki.selfhtml.org/wiki/JavaScript/URL/createObjectURL"