Ich habe in letzter Zeit mit WebGL herumgespielt und einen Collada-Leser zum Laufen gebracht. Das Problem ist, dass es ziemlich langsam ist (Collada ist ein sehr ausführliches Format), daher werde ich anfangen, Dateien in ein einfacher zu verwendendes Format (wahrscheinlich JSON) zu konvertieren. Ich habe bereits den Code zum Parsen der Datei in JavaScript, daher kann ich ihn auch als Exporteur verwenden! Das Problem ist das Speichern.
Jetzt weiß ich, dass ich die Datei analysieren, das Ergebnis an den Server senden und vom Browser die Datei als Download vom Server zurückfordern lassen kann. In Wirklichkeit hat der Server jedoch nichts mit diesem bestimmten Prozess zu tun. Warum sollte er also beteiligt werden? Ich habe bereits den Inhalt der gewünschten Datei im Speicher. Gibt es eine Möglichkeit, dem Benutzer einen Download mit reinem JavaScript zu präsentieren? (Ich bezweifle es, könnte aber genauso gut fragen ...)
Und um klar zu sein: Ich versuche nicht, ohne Wissen des Benutzers auf das Dateisystem zuzugreifen! Der Benutzer stellt eine Datei bereit (wahrscheinlich per Drag & Drop), das Skript transformiert die Datei im Speicher und der Benutzer wird aufgefordert, das Ergebnis herunterzuladen. All dies sollten für den Browser "sichere" Aktivitäten sein.
[BEARBEITEN]: Ich habe es nicht im Voraus erwähnt, daher sind die Poster, die mit "Flash" geantwortet haben, gültig genug, aber ein Teil meiner Arbeit besteht darin, hervorzuheben, was mit reinem HTML5 möglich ist ... also ist Flash direkt in meinem Fall. (Obwohl dies eine absolut gültige Antwort für jeden ist, der eine "echte" Web-App erstellt.) In diesem Fall habe ich anscheinend kein Glück, es sei denn, ich möchte den Server einbeziehen. Danke trotzdem!
quelle
Antworten:
OK, Daten erstellen: URI macht definitiv den Trick für mich, dank Matthew und Dennkster, die auf diese Option hinweisen! Hier ist im Grunde, wie ich es mache:
1) Holen Sie sich den gesamten Inhalt in eine Zeichenfolge namens "Inhalt" (z. B. indem Sie ihn zunächst dort erstellen oder innerHTML des Tags einer bereits erstellten Seite lesen).
2) Erstellen Sie den Daten-URI:
Abhängig vom Browsertyp usw. gibt es Längenbeschränkungen, aber z. B. funktioniert Firefox 3.6.12 bis mindestens 256 KB. Das Codieren in Base64 anstelle von encodeURIComponent könnte die Dinge effizienter machen, aber für mich war das in Ordnung.
3) Öffnen Sie ein neues Fenster und leiten Sie es zu diesem URI um. Sie werden aufgefordert, einen Download-Speicherort für meine von JavaScript generierte Seite einzugeben:
Das ist es.
quelle
location.href
auf den Inhalt einstellen .location.href = uriContent
.location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());
sie. Der Inhalt von @ Nøks Antwort wird in einer Datei gespeichert. Ich habe keinen IE, um es zu testen, aber es funktioniert für Webkit.Einfache Lösung für HTML5-fähige Browser ...
Verwendungszweck
quelle
HTML5 hat eine
window.saveAs(blob, filename)
Methode definiert . Es wird derzeit von keinem Browser unterstützt. Es gibt jedoch eine Kompatibilitätsbibliothek namens FileSaver.js , die diese Funktion den meisten modernen Browsern (einschließlich Internet Explorer 10+) hinzufügt. Internet Explorer 10 unterstützt einenavigator.msSaveBlob(blob, filename)
Methode ( MSDN ), die in FileSaver.js für die Unterstützung von Internet Explorer verwendet wird.Ich habe einen Blogeintrag mit weiteren Details zu diesem Problem geschrieben.
quelle
Große Dateien speichern
Lange Daten-URIs können in Browsern zu Leistungsproblemen führen. Eine weitere Option zum Speichern clientseitig generierter Dateien besteht darin, deren Inhalt in ein Blob- (oder Datei-) Objekt einzufügen und mithilfe einen Download-Link zu erstellen
URL.createObjectURL(blob)
. Dies gibt eine URL zurück, mit der der Inhalt des Blobs abgerufen werden kann. Der Blob wird im Browser gespeichert, bis entwederURL.revokeObjectURL()
die URL aufgerufen wird oder das Dokument, das ihn erstellt hat, geschlossen wird. Die meisten Webbrowser unterstützen Objekt-URLs . Opera Mini ist der einzige, der sie nicht unterstützt.Download erzwingen
Wenn es sich bei den Daten um Text oder ein Bild handelt, kann der Browser die Datei öffnen, anstatt sie auf der Festplatte zu speichern. Um zu bewirken, dass die Datei beim Klicken auf den Link heruntergeladen wird, können Sie das
download
Attribut verwenden. Allerdings unterstützen nicht alle Webbrowser das Download-Attribut . Eine andere Option ist die Verwendungapplication/octet-stream
als MIME-Typ der Datei. Dies führt jedoch dazu, dass die Datei als binärer Blob dargestellt wird. Dies ist besonders benutzerunfreundlich, wenn Sie keinen Dateinamen angeben oder nicht angeben können. Siehe auch Popup ' Öffnen unter "Speichern unter ...", das beim Klicken auf einen Textlink geöffnet wird. Klicken Sie für PDF in HTML. 'Angeben eines Dateinamens
Wenn der Blob mit dem Dateikonstruktor erstellt wird, können Sie auch einen Dateinamen festlegen, aber nur wenige Webbrowser (einschließlich Chrome und Firefox) unterstützen den Dateikonstruktor . Der Dateiname kann auch als Argument für das
download
Attribut angegeben werden, dies unterliegt jedoch einer Reihe von Sicherheitsaspekten . Internet Explorer 10 und 11 bieten eine eigene Methode, msSaveBlob , um einen Dateinamen anzugeben.Beispielcode
quelle
msSaveBlob
das Dialogfeld "Speichern unter" öffnen. Bei anderen Browsern können Sie nur manuell "Speichern unter" aus dem Kontextmenü des Download-Links auswählen.document.getElementById('link').href = url;
kann Ihr Code den Link mithilfe der.click()
Methode des Elements auslösen.quelle
a.click
Code ersetze ,document.createEvent()
wie von Matěj Pokorný vorgeschlagen, funktioniert dies auf FF, aber nicht auf IE. Ich habe Chrome nicht ausprobiert.Schauen Sie sich dazu Doug Neiners Downloadify an , eine Flash-basierte JavaScript-Oberfläche.
quelle
HTML 5
Banner erneut fragen und umformulieren und entsprechend markieren? Das würde wahrscheinlich diejenigen Benutzer anziehen, die sich mit diesem speziellen Bereich auskennen (ich nehme an, es ist derzeit noch eine vergleichsweise kleine Menge). Ich bin mir ziemlich sicher, dass dies in HTML 5 möglich ist, aber ich habe keine Ahnung, wie.Einfache Lösung!
Funktioniert in allen modernen Browsern.
quelle
window.open()
. Es ist irrelevant. Sie können diese Methode verwenden und ein a erzwingen.click()
, aber beobachten Sie das Timing, da es Firefox nicht gefällt, wenn Sie aufrufen,.click()
bevor Sie das Element an den Körper anhängen lassen.Sie können einen Daten-URI generieren . Es gibt jedoch browserspezifische Einschränkungen.
quelle
"data:text/plain;charset=UTF-8,"+encodeURIComponent(text)
Aber ja, der IE begrenzt die Größe von Daten-URLs auf eine unbrauchbare Menge und unterstützt sie nicht für Dinge wiewindow.open(...)
oder iframes (glaube ich).Ich habe FileSaver ( https://github.com/eligrey/FileSaver.js ) verwendet und es funktioniert einwandfrei .
Zum Beispiel habe ich diese Funktion ausgeführt, um auf einer Seite angezeigte Protokolle zu exportieren.
Sie müssen ein Array für die Instanziierung des Blobs übergeben, also habe ich das vielleicht nicht richtig geschrieben, aber es funktioniert für mich.
Nur für den Fall, seien Sie vorsichtig mit dem Ersetzen: Dies ist die Syntax, um dies global zu machen, andernfalls wird nur die erste ersetzt, die er trifft.
quelle
w.close();
nach demexecCommand
Ich habe zwei einfache Ansätze gefunden, die für mich funktionieren. Verwenden Sie zunächst ein bereits angeklicktes
a
Element und fügen Sie die Download-Daten ein. Und zweitens: Generieren einesa
Elements mit den Download-Daten, Ausführena.click()
und erneutes Entfernen. Der zweite Ansatz funktioniert jedoch nur, wenn er auch von einer Benutzerklickaktion aufgerufen wird. (Einige) Browser blockierenclick()
aus anderen Kontexten wie beim Laden oder werden nach einem Timeout ausgelöst (setTimeout).quelle
a
das Dokument auch in das Dokument einfügen (möglicherweise mit"display:none"
), darauf klicken und es dann entfernen.Hier ist ein Link zu der Daten-URI-Methode, die Mathew vorgeschlagen hat. Sie hat auf Safari funktioniert, aber nicht gut, da ich den Dateityp nicht festlegen konnte. Sie wird als "unbekannt" gespeichert. Dann muss ich später erneut dorthin gehen und die Reihenfolge ändern um die Datei anzuzeigen ...
http://www.nihilogic.dk/labs/canvas2image/
quelle
Sie können localStorage verwenden. Dies ist das HTML5-Äquivalent von Cookies. Es scheint unter Chrome und Firefox zu funktionieren, ABER unter Firefox musste ich es auf einen Server hochladen. Das heißt, das Testen direkt auf meinem Heimcomputer hat nicht funktioniert.
Ich arbeite an HTML5-Beispielen. Gehen Sie zu http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html und scrollen Sie zum Labyrinth. Die Informationen zum Wiederherstellen des Labyrinths werden mithilfe von localStorage gespeichert.
Ich bin zu diesem Artikel gekommen und habe nach HTML5-JavaScript zum Laden und Arbeiten mit XML-Dateien gesucht. Ist es das gleiche wie älteres HTML und JavaScript ????
quelle
Versuchen
Wenn Sie Binärdaten herunterladen möchten, klicken Sie hier
Aktualisieren
2020.06.14 Ich aktualisiere Chrome auf 83.0 und höher. SO-Snippet-Stopp funktioniert (aufgrund von Sandbox-Sicherheitsbeschränkungen ) - aber die JSFiddle-Version funktioniert hier
quelle
Wie bereits erwähnt, können die Datei- API zusammen mit den FileWriter- und FileSystem- APIs verwendet werden, um Dateien auf dem Computer eines Clients über den Kontext einer Browser-Registerkarte / eines Browser-Fensters zu speichern.
Es gibt jedoch einige Dinge im Zusammenhang mit den beiden letztgenannten APIs, die Sie beachten sollten:
Hier sind einfache Beispiele dafür, wie die APIs direkt und indirekt zusammen verwendet werden, um dies zu tun:
BakedGoods *
Verwenden der Rohdatei-, FileWriter- und FileSystem-APIs
Obwohl die FileSystem- und FileWriter-APIs nicht mehr auf der Standardspur sind, kann ihre Verwendung meiner Meinung nach in einigen Fällen gerechtfertigt sein, weil:
Ob "einige Fälle" Ihre eigenen umfassen, müssen Sie jedoch selbst entscheiden.
* BakedGoods wird von niemand anderem als diesem Kerl hier gepflegt :)
quelle
Dieser Thread war von unschätzbarem Wert, um herauszufinden, wie eine Binärdatei generiert und die benannte Datei heruntergeladen werden kann, alles im Client-Code ohne Server.
Der erste Schritt für mich war das Generieren des binären Blobs aus Daten, die ich gespeichert habe. Es gibt viele Beispiele dafür für einen einzelnen Binärtyp. In meinem Fall habe ich ein Binärformat mit mehreren Typen, die Sie als Array übergeben können, um den Blob zu erstellen.
Der nächste Schritt besteht darin, den Browser zu veranlassen, den Benutzer aufzufordern, diesen Blob mit einem vordefinierten Namen herunterzuladen.
Ich brauchte nur einen benannten Link, den ich in HTML5 hinzugefügt hatte und den ich wiederverwenden konnte, um den ursprünglichen Dateinamen umzubenennen. Ich habe es versteckt gehalten, da der Link nicht angezeigt werden muss.
Der letzte Schritt besteht darin, den Benutzer zum Herunterladen der Datei aufzufordern.
quelle
Hier ist ein Tutorial zum Exportieren von Dateien als ZIP:
Bevor Sie beginnen, gibt es eine Bibliothek zum Speichern von Dateien. Der Name der Bibliothek lautet fileSaver.js. Diese Bibliothek finden Sie hier. Beginnen wir jetzt mit den erforderlichen Bibliotheken:
Kopieren Sie nun diesen Code und dieser Code lädt eine Zip-Datei mit einer Datei hello.txt mit Inhalt Hello World herunter. Wenn alles gut funktioniert, wird eine Datei heruntergeladen.
Dadurch wird eine Datei namens file.zip heruntergeladen. Weitere Informationen finden Sie hier: http://www.wapgee.com/story/248/guide-to-create-zip-files-using-javascript-by-using-jszip-library
quelle