Wie lese und schreibe ich mit JavaScript in eine Datei?

177

Kann jemand einen Beispielcode zum Lesen und Schreiben einer Datei mit JavaScript geben?

user4642212
quelle
2
Wieso brauchst du es? Möglicherweise gibt es Problemumgehungen.
Ionuț G. Stan
1
wurde schon oft gefragt
annakata
1
Ich habe diese Ressource bezüglich der clientseitigen Dateispeicherung gefunden. html5rocks.com/de/tutorials/offline/storage Nach dem, was ich gesammelt habe, ermöglicht HTML5 Websights tatsächlich, Informationen auf der lokalen Festplatte des Benutzers zu speichern, jedoch in einem datenbankähnlicheren Stil. Der Browser verwaltet den Dateispeicher und legt bestimmte Einschränkungen fest, um zu verhindern, dass das World Wide Web die Festplatten der Benutzer bis zum Rand lädt. Sie sind noch nicht vollständig narrensicher, aber sie werden zumindest gemäß diesem Artikel optimiert. Lesen Sie für Details.
Garrett
2
Verwenden Sie Ajax und mit PHP das Lesen und Schreiben von Dateien. Wenn Sie auf Client-Seite in Dateien schreiben möchten, sollten Sie dies vergessen. Es würde erfordern, dass viele Sicherheitsoptionen auf dem Server deaktiviert werden, und Sie würden mit einer äußerst unsicheren Site zurückbleiben. Wenn Sie PHP nicht verwenden möchten, können Sie möglicherweise mithilfe von JavaScript-Cookies Daten auf dem Clientcomputer speichern.
Dan Bray

Antworten:

64

Der Vollständigkeit halber gibt das OP nicht an, dass er dies in einem Browser tun möchte (wenn dies der Fall ist, ist dies im Allgemeinen nicht möglich).

Javascript an sich erlaubt dies jedoch; Dies kann mit serverseitigem Javascript erfolgen.

Weitere Informationen finden Sie in dieser Dokumentation zur Javascript-Dateiklasse

Bearbeiten : Dieser Link führte zu den Sun-Dokumenten, die jetzt von Oracle verschoben wurden.

Um mit der Zeit zu gehen, finden Sie hier die Dokumentation zu node.js für die FileSystem-Klasse: http://nodejs.org/docs/latest/api/fs.html

Bearbeiten (2) : Sie können Dateien jetzt clientseitig mit HTML5 lesen: http://www.html5rocks.com/en/tutorials/file/dndfiles/

DanSingerman
quelle
3
Ist es möglich, auch mit HTML5 in lokale Dateien zu schreiben?
Anderson Green
1
Abhängig von Ihrer Situation können Sie auch einen Ajax-Aufruf an ein PHP-Skript senden und die Daten auf diese Weise sichern. Dies war in meiner Situation nützlich, in der ich einige Daten speichern wollte, die auf der Javascript-Seite generiert wurden, aber es war egal, wie sie dort ankamen.
Dustin Graham
1
@DustinGraham, Eigentlich können wir jetzt mit Chrome-APIs tatsächlich Dateien über JavaScript auf die Clientseite schreiben, oder?
Pacerier
40

Nein. Browserseitiges Javascript hat keine Berechtigung zum Schreiben auf den Clientcomputer, ohne dass viele Sicherheitsoptionen deaktiviert werden müssen

Gareth
quelle
44
@marcgg: Das macht diese Antwort unvollständig, nicht falsch. Und seien wir ehrlich, es ist sehr wahrscheinlich , dass diese Antwort tut decken den Anwendungsfall des OP.
Leichtigkeitsrennen im Orbit
36
Wenn das OP vorhatte, Javascript außerhalb des Browsers zu verwenden, ist dies ungewöhnlich genug, dass sie es wahrscheinlich erwähnt hätten. Es ist nicht unangemessen (und definitiv nicht falsch), einen Browser anzunehmen. +1 (um marcggs -1 auszugleichen).
Michael Martin-Smucker
2
@LightnessRacesinOrbit Der Downvote-Button bedeutet nicht, dass die Antwort als falsch angesehen wird. Der Tooltip-Text lautet This answer is not useful.
Scruffy
1
@Mike - Es war nicht der Zeitpunkt, an dem diese Antwort geschrieben wurde, und es ist immer noch vernünftig, standardmäßig browser-seitiges JS anzunehmen.
Quentin
16

Die Zukunft ist da! Die Vorschläge stehen kurz vor dem Abschluss, nicht mehr ActiveX oder Flash oder Java. Jetzt können wir verwenden:

Sie können die Datei per Drag & Drop in den Browser oder über ein einfaches Upload-Steuerelement übertragen. Sobald der Benutzer eine Datei ausgewählt hat, können Sie diese mit Javascript lesen: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Thomas Shields
quelle
Links sind jetzt kaputt.
Prometheus
Links sind wieder kaputt, sie sind beide der gleiche Link, aber mit unterschiedlichen Bedeutungen. Gebrochen.
Insidesin
@insidesin behoben
Thomas Shields
14

Hier ist der Mozilla-Vorschlag

http://www-archive.mozilla.org/js/js-file-object.html

Dies wird mit einem Kompilierungsschalter in Spidermonkey und auch in Adobe Extendedcript implementiert. Zusätzlich (glaube ich) erhalten Sie das File-Objekt in Firefox-Erweiterungen.

rhino hat eine (eher rudementäre) readFile-Funktion https://developer.mozilla.org/en/Rhino_Shell

Für komplexere Dateioperationen in Rhino können Sie die Methoden java.io.File verwenden.

Sie werden jedoch nichts davon im Browser erhalten. Für ähnliche Funktionen in einem Browser können Sie die SQL-Datenbankfunktionen von HTML5, clientseitige Persistenz, Cookies und Flash-Speicherobjekte verwenden.

Bretonisch
quelle
12

Diese Javascript-Funktion bietet dem Benutzer, der dies über den Browser ausführt, ein vollständiges Dialogfeld "Speichern unter". Der Benutzer drückt OK und die Datei wird gespeichert.

Bearbeiten: Der folgende Code funktioniert nur mit dem IE-Browser, da Firefox und Chrome diesen Code als Sicherheitsproblem angesehen und seine Funktion blockiert haben.

// content is the data you'll write to file<br/>
// filename is the filename<br/>
// what I did is use iFrame as a buffer, fill it up with text
function save_content_to_file(content, filename)
{
    var dlg = false;
    with(document){
     ir=createElement('iframe');
     ir.id='ifr';
     ir.location='about.blank';
     ir.style.display='none';
     body.appendChild(ir);
      with(getElementById('ifr').contentWindow.document){
           open("text/plain", "replace");
           charset = "utf-8";
           write(content);
           close();
           document.charset = "utf-8";
           dlg = execCommand('SaveAs', false, filename+'.txt');
       }
       body.removeChild(ir);
     }
    return dlg;
}

Rufen Sie die Funktion auf:

save_content_to_file("Hello", "C:\\test");
Temp
quelle
1
ir = createElement ('iframe'); - iframe ist iFrame ID.
Temp
Funktioniert es auch auf allen Betriebssystemen (solange ein gültiger Dateispeicherort ausgewählt ist?)
Anderson Green
4
Dies ist eine gute Lösung, aber funktioniert es nur mit IE? Ich habe IE und FF ausprobiert und mit FF funktioniert es nicht.
U.
9

Wenn Sie JScript (Microsoft Javascript) verwenden, um lokales Scripting mit WSH durchzuführen (NICHT in einem Browser!), Können Sie Scripting.FileSystemObjectauf das Dateisystem zugreifen.

Ich denke, Sie können auf dasselbe Objekt im IE zugreifen, wenn Sie viele Sicherheitseinstellungen deaktivieren, aber das wäre eine sehr, sehr schlechte Idee.

MSDN hier

Dana Robinson
quelle
Ich wollte dies in einer htaAnwendung tun und das löst es
chiliNUT
8

Derzeit können Dateien mit den APIs File , FileWriter und FileSystem aus dem Kontext eines Browser-Tabs / -Fensters geschrieben und gelesen werden , obwohl ihre Verwendung einige Einschränkungen aufweist (siehe Ende dieser Antwort).

Aber um Ihre Frage zu beantworten:

Verwenden von BakedGoods *

Datei schreiben:

bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

Datei lesen:

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

Verwenden der Rohdatei-, FileWriter- und FileSystem-APIs

Datei schreiben:

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Datei lesen:

function onQuotaRequestSuccess(grantedQuota)
{

    function getfile(directoryEntry)
    {

        function readFile(fileEntry)
        {

            function read(file)
            {
                var fileReader = new FileReader();

                fileReader.onload = function(){var fileData = fileReader.result};
                fileReader.readAsText(file);             
            }

            fileEntry.file(read);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: false},
            readFile
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Genau das, wonach Sie gefragt haben, oder? Vielleicht, vielleicht nicht. Die beiden letztgenannten APIs:

  • Sind derzeit nur in Chromium-basierten Browsern (Chrome & Opera) implementiert
  • Wurden von der W3C-Standardspur genommen und sind ab sofort proprietäre APIs
  • Kann in Zukunft aus den implementierenden Browsern entfernt werden
  • Beschränken Sie die Erstellung von Dateien auf eine Sandbox (ein Speicherort, außerhalb dessen die Dateien keine Auswirkungen haben können) auf der Festplatte

Darüber hinaus definiert die FileSystem-Spezifikation keine Richtlinien dafür, wie Verzeichnisstrukturen auf der Festplatte angezeigt werden sollen. In Chromium-basierten Browsern verfügt die Sandbox beispielsweise über ein virtuelles Dateisystem (eine Verzeichnisstruktur, die nicht unbedingt in derselben Form auf der Festplatte vorhanden ist wie beim Zugriff über den Browser), in der die Verzeichnisse und Dateien mit dem erstellt werden APIs werden platziert.

Obwohl Sie möglicherweise in der Lage sind, Dateien mit den APIs in ein System zu schreiben, kann das Auffinden der Dateien ohne die APIs (also ohne die FileSystem-API) eine nicht triviale Angelegenheit sein.

Wenn Sie mit diesen Problemen / Einschränkungen umgehen können, sind diese APIs so ziemlich die einzige native Möglichkeit, das zu tun, was Sie gefragt haben.

Wenn Sie für nicht native Lösungen offen sind, ermöglicht Silverlight auch Datei-E / A von einem Registerkarten- / Fensterwettbewerb über IsolatedStorage . Zur Nutzung dieser Funktion ist jedoch verwalteter Code erforderlich. Eine Lösung, die das Schreiben eines solchen Codes erfordert, geht über den Rahmen dieser Frage hinaus.

Natürlich liegt eine Lösung, die komplementären verwalteten Code verwendet und nur Javascript zum Schreiben übrig lässt, im Rahmen dieser Frage;):

//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem", "silverlight"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

* BakedGoods ist eine Javascript-Bibliothek, die eine einheitliche Schnittstelle erstellt, über die gemeinsame Speichervorgänge in allen nativen und einigen nicht nativen Speichereinrichtungen ausgeführt werden können. Es wird von diesem Kerl hier gepflegt :).

Kevin
quelle
5

Im Kontext des Browsers kann Javascript eine benutzerdefinierte Datei LESEN. Weitere Informationen zum Lesen von Dateien mithilfe der Datei-API finden Sie in Eric Bidelmans Blog . Es ist jedoch nicht möglich, dass browserbasiertes Javascript das Dateisystem des lokalen Computers SCHREIBT, ohne einige Sicherheitseinstellungen zu deaktivieren, da es als Sicherheitsbedrohung für jede Website angesehen wird, Ihr lokales Dateisystem willkürlich zu ändern.

Wenn Sie das sagen, gibt es einige Möglichkeiten, dies zu umgehen, je nachdem, was Sie versuchen:

  1. Wenn es sich um Ihre eigene Site handelt, können Sie ein Java-Applet in die Webseite einbetten. Der Besucher muss jedoch Java auf dem lokalen Computer installieren und wird über das Sicherheitsrisiko informiert. Der Besucher muss zulassen, dass das Applet geladen wird. Ein Java-Applet ist wie eine ausführbare Software, die vollständigen Zugriff auf den lokalen Computer hat.

  2. Chrome unterstützt ein Dateisystem, das ein Sandbox-Teil des lokalen Dateisystems ist. Siehe diese Seite für Details. Dies ermöglicht es Ihnen möglicherweise, Dinge vorübergehend lokal zu speichern. Dies wird jedoch von anderen Browsern nicht unterstützt.

  3. Wenn Sie nicht auf den Browser beschränkt sind, verfügt Node.js über eine vollständige Dateisystemschnittstelle. Hier finden Sie die Dokumentation zum Dateisystem . Beachten Sie, dass Node.js nicht nur auf Servern ausgeführt werden kann, sondern auch auf jedem Client-Computer, einschließlich Windows. Der Javascript-Testläufer Karma basiert auf Node.js. Wenn Sie nur in Javascript auf dem lokalen Computer programmieren möchten, ist dies eine Option.

gm2008
quelle
3

Um eine Datei zu erstellen, versuchen Sie es

function makefile(){
  var fso;
  var thefile;

    fso = new ActiveXObject("Scripting.FileSystemObject");
    thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);

    thefile.close()
    }

Erstellen Sie Ihr Verzeichnis auf dem Laufwerk C, da Windows gegen das Schreiben aus dem Web geschützt ist, z. B. einen Ordner mit dem Namen "tmp" auf dem Laufwerk C.

Ifiok Idiang
quelle
2

Sie müssen sich an Flash, Java oder Silverlight wenden. Im Fall von Silverlight sehen Sie sich Isolated Storage an . Dadurch können Sie in Dateien auf Ihrem eigenen Spielplatz auf der Festplatte des Benutzers schreiben. Sie können jedoch nicht außerhalb Ihres Spielplatzes schreiben.

Cory R. King
quelle
1

Sie können dies nicht browserübergreifend tun. IE hat Methoden, um "vertrauenswürdigen" Anwendungen zu ermöglichen, ActiveX-Objekte zum Lesen / Schreiben von Dateien zu verwenden, aber das ist es leider.

Wenn Sie Benutzerinformationen speichern möchten, müssen Sie höchstwahrscheinlich Cookies verwenden.

Philip Reynolds
quelle
4
Und was genau ist das Hindernis, um eine "vertrauenswürdige" Anwendung zu werden? Ein Bestätigungsdialog?
Bretonischer
@Philip, niemand sagte, es muss Cross-Browser sein. Eine andere Lösung für jeden Browser ist in Ordnung.
Pacerier
1

Bei einem ReactJS-Test schreibt der folgende Code erfolgreich eine Datei:

import writeJsonFile from 'write-json-file';

const ans = 42;
writeJsonFile('answer.txt', ans);

const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);

Die Datei wird in das Verzeichnis geschrieben, das die Tests enthält. Wenn Sie also in eine aktuelle JSON-Datei '* .json' schreiben, wird eine Schleife erstellt!

Steve Pitchers
quelle
0

Sie können auf der Clientseite keine Datei-E / A mit Javascript ausführen, da dies ein Sicherheitsrisiko darstellt. Sie müssten sie entweder zum Herunterladen und Ausführen einer Exe veranlassen, oder wenn sich die Datei auf Ihrem Server befindet, verwenden Sie AJAX und eine serverseitige Sprache wie PHP, um die E / A auf der Serverseite auszuführen

Klicken Sie auf Upvote
quelle
1
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Harpun
@harpun, genau. Bitte löschen Sie diese Antwort und wandeln Sie sie in einen Kommentar um.
Pacerier
0

Es gibt zwei Möglichkeiten, eine Datei mit JavaScript zu lesen und zu schreiben

  1. Verwenden von JavaScript-Erweiterungen

  2. Verwenden einer Webseite und ActiveX-Objekte

Grigor IWT
quelle
-1

Hier ist eine Schreiblösung für Chrome v52 + (Benutzer muss noch ein Ziel auswählen ...)
Quelle: StreamSaver.js

<!-- load StreamSaver.js before streams polyfill to detect support -->
<script src="StreamSaver.js"></script>
<script src="https://wzrd.in/standalone/web-streams-polyfill@latest"></script>
const writeStream = streamSaver.createWriteStream('filename.txt')
const encoder = new TextEncoder
let data = 'a'.repeat(1024)
let uint8array = encoder.encode(data + "\n\n")

writeStream.write(uint8array) // must be uInt8array
writeStream.close()

Am besten geeignet zum Schreiben großer Datenmengen, die auf der Clientseite generiert wurden.
Ansonsten schlage ich vor, FileSaver.js zum Speichern von Blob / Files zu verwenden

Endlos
quelle