JavaScriptを使用してファイルを読み書きする方法は?


177

JavaScriptを使用してファイルを読み書きするためのサンプルコードを誰かに与えることはできますか?


2
なぜあなたはそれが必要なのですか?多分回避策があります。
Ionuț G. Stan


1
実際には以前にも何度も尋ねられていました
アンナカタ09

1
クライアント側のファイルストレージに関するこのリソースを見つけました。html5rocks.com/en/tutorials/offline/storage私が収集したものから、HTML5は実際にWebsightsがユーザーのローカルハードドライブに情報を保存できるようにしますが、よりデータベースのようなマナーに保存できます。ブラウザはファイルストレージを管理し、特定の制限を課して、World Wide Webが人々のハードドライブをすぐにロードするのを防ぎます。それらはまだ完全な証拠ではありませんが、少なくともこの記事によると、調整されています。詳細はこちらをご覧ください。
Garrett

2
Ajaxを使用し、PHPでファイルの読み取りと書き込みを処理します。ファイルへの書き込みをクライアント側で処理したい場合は、忘れてください。サーバーで多くのセキュリティオプションを無効にする必要があり、非常に安全でないサイトが残ります。PHPを使用したくない場合は、JavaScript Cookieを使用してクライアントコンピューターにデータを保存することで、実現したいことを実現できます。
Dan Bray 2017年

回答:


64

完全を期すために、OPはブラウザーでこれを実行しようとしていることを述べていません(述べられているように、彼がそうである場合、それは一般的に不可能です)

ただし、JavaScript自体はこれを許可します。サーバー側のJavaScriptで実行できます。

Javascript Fileクラスについては、このドキュメントを参照してください

編集:そのリンクは、現在Oracleによって移動されたSunのドキュメントへのリンクでした。

時代に遅れないようにするには、FileSystemクラスのnode.jsのドキュメントをご覧ください。http//nodejs.org/docs/latest/api/fs.html

Edit(2):HTML5を使用してクライアント側でファイルを読み取ることができます:http : //www.html5rocks.com/en/tutorials/file/dndfiles/


3
HTML5を使用してローカルファイルに書き込むこともできますか?
アンダーソングリーン

1
また、状況によっては、phpスクリプトにajax呼び出しを行い、その方法でデータをダンプすることもできます。これは、JavaScript側で生成されたいくつかのデータを保存したい状況で役立ちましたが、どのようにそこに到達したかは関係ありませんでした。
ダスティングラハム

1
@DustinGraham、実際にChrome APIを使用すると、JavaScriptを介してクライアント側にファイルを実際に書き込むことができますか?
Pacerier

40

いいえ。ブラウザ側のJavaScriptには、多くのセキュリティオプションを無効にする必要がないクライアントマシンへの書き込み権限がありません。


44
@marcgg:そのため、この回答は不完全ではなく、正しくありません。それに直面してみましょう。この回答 OPのユースケースをカバーしている可能性は非常に高いです。
オービットでの軽さのレース

36
OPがブラウザの外でjavascriptを使用することを計画している場合、それは彼らがおそらくそれを言及するであろうほど一般的ではありません。ブラウザを想定することは不合理ではありません(そして間違いなく間違いではありません)。+1(marcggの-1を補うため)。
マイケルマーティンスマッカー、2011年

2
@LightnessRacesinOrbit反対投票ボタンは、回答が正しくないと考えられていることを意味するものではありません。ツールチップテキストはThis answer is not usefulです。
だらしない、2015年

1
@Mike —この答えが書かれたのは当時ではなく、ブラウザ側のJSをデフォルトで想定することは依然として妥当です。
クエンティン

16

未来はここにあります!提案は完成に近づいており、ActiveX、Flash、Javaはありません。これで使用できます:

ドラッグ/ドロップを使用してファイルをブラウザーに取り込むか、単純なアップロードコントロールを使用できます。ユーザーがファイルを選択したら、Javascriptでファイルを読むことができます。http//www.html5rocks.com/en/tutorials/file/dndfiles/


リンクが壊れています。
プロメテウス2016年

リンクは再び壊れて、両方とも同じリンクですが、意味が異なります。
Insidesin

@insidesin修正
Thomas Shields

14

これがモジラの提案です

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

これは、spidermonkeyのコンパイルスイッチと、adobeの拡張スクリプトで実装されます。さらに(私はそう思います)、Firefox拡張機能でFileオブジェクトを取得します。

rhinoには(かなり基本的な)readFile関数があり ますhttps://developer.mozilla.org/en/Rhino_Shell

rhinoでより複雑なファイル操作を行うには、java.io.Fileメソッドを使用できます。

ただし、ブラウザでこのようなものを取得することはできません。ブラウザで同様の機能を使用するには、HTML5のSQLデータベース関数、クライアント側の永続性、Cookie、およびフラッシュストレージオブジェクトを使用できます。


12

このJavaScript関数は、ブラウザからこれを実行するユーザーに完全な「名前を付けて保存」ダイアログボックスを表示します。ユーザーが[OK]を押すと、ファイルが保存されます。

編集:次のコードはIEブラウザーでのみ機能します。FirefoxとChromeはこのコードをセキュリティ上の問題と見なしており、機能しないようにブロックしているためです。

// 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;
}

関数を呼び出します。

save_content_to_file("Hello", "C:\\test");

1
ir = createElement( 'iframe'); -iframeはiFrame IDです。
2011年

また、すべてのオペレーティングシステムで動作します(有効なファイルの場所が選択されている限り)
Anderson Green

4
これは良い解決策ですが、IEだけで動作しますか?IEとFFを試しましたが、FFでは動作しません。
u.gen 2012年

9

JScript(MicrosoftのJavascript)を使用してWSHを使用したローカルスクリプトを実行している場合(ブラウザでは使用できません!)Scripting.FileSystemObject、ファイルシステムへのアクセスに使用できます。

多くのセキュリティ設定をオフにすると、IEで同じオブジェクトにアクセスできると思いますが、これは非常に悪い考えです。

MSDNはこちら


私はこれをhtaアプリケーションで実行したかったので、それを解決しました
chiliNUT

8

現在、ファイルはFileFileWriter、およびFileSystem APIを使用してブラウザーのタブ/ウィンドウのコンテキストから読み書きできますが、それらの使用には注意点があります(この回答の末尾を参照)。

しかし、あなたの質問に答えるには:

BakedGoodsの使用*

ファイルを書き込む:

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

ファイルを読む:

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

未加工のFile、FileWriter、およびFileSystem APIの使用

ファイルを書き込む:

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);

ファイルを読む:

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);

あなたが右に求めたものだけですか?多分そうでないかもしれません。後の2つのAPI:

  • 現在、Chromiumベースのブラウザー(ChromeおよびOpera)にのみ実装されています
  • W3C標準トラックから外されており、現時点では独自のAPIです。
  • 将来、実装ブラウザから削除される可能性があります
  • ファイルの作成をディスク上のサンドボックス(ファイルの外側では効果が得られない場所)に制限する

さらに、FileSystem仕様では、ディレクトリ構造がディスク上にどのように表示されるかについてのガイドラインは定義されていません。たとえば、Chromiumベースのブラウザーでは、サンドボックスには仮想ファイルシステム(必ずしも、ブラウザー内からアクセスした場合と同じ形式でディスク上に存在するわけではないディレクトリ構造)があり、その中にディレクトリとファイルがAPIが配置されます。

そのため、APIを使用してシステムにファイルを書き込むことはできますが、APIなしで(ファイルシステムAPIなしで)ファイルを見つけることは簡単なことではありません。

これらの問題/制限に対処できる場合、これらのAPIは、要求したことを実行するためのほとんどのネイティブな方法です。

非ネイティブソリューションを利用している場合、Silverlightでは、タブ/ウィンドウコンテストからIsolatedStorageを介してファイルI / Oを行うこともできます。ただし、この機能を利用するにはマネージコードが必要です。このようなコードを記述する必要があるソリューションは、この質問の範囲を超えています。

もちろん、補完するマネージコードを利用し、Javascriptのみを記述して残しておくソリューションは、この質問の範囲内です;):

//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は、すべてのネイティブおよび一部の非ネイティブストレージ機能で共通のストレージ操作を実行するために使用できる統一されたインターフェイスを確立するJavascriptライブラリです。それはこの男がここで管理しています:)。



5

ブラウザのコンテキストでは、JavaScriptはユーザー指定のファイルを読み取ることができます。File APIを使用してファイルを読み取る方法の詳細については、Eric Bidelmanのブログを参照してください。ただし、ウェブサイトがローカルファイルシステムを勝手に変更することはセキュリティ上の脅威と見なされるため、ブラウザベースのJavascriptが一部のセキュリティ設定を無効にせずにローカルコンピュータのファイルシステムを書き込むことはできません。

それを言って、あなたが何をしようとしているのかに応じてそれを回避するいくつかの方法があります:

  1. 自分のサイトであれば、JavaアプレットをWebページに埋め込むことができます。ただし、訪問者はローカルマシンにJavaをインストールする必要があり、セキュリティリスクについて警告されます。訪問者はアプレットのロードを許可する必要があります。Javaアプレットは、ローカルコンピュータに完全にアクセスできる実行可能ソフトウェアのようなものです。

  2. Chromeは、ローカルファイルシステムのサンドボックス化された部分であるファイルシステムをサポートしています。詳細については、このページを参照してください。これにより、ローカルに一時的に保存することができます。ただし、これは他のブラウザではサポートされていません。

  3. ブラウザに限定されていない場合、Node.jsには完全なファイルシステムインターフェースがあります。ファイルシステムのドキュメントについては、こちらを参照してください。Node.jsはサーバーだけでなく、Windowsを含むすべてのクライアントコンピューターでも実行できることに注意してください。JavaScriptテストランナーKarmaはNode.jsに基づいています。ローカルコンピュータのJavaScriptでプログラミングしたい場合は、これはオプションです。


3

ファイルを作成するには

function makefile(){
  var fso;
  var thefile;

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

    thefile.close()
    }

WindowsはCドライブに「tmp」という名前のフォルダーを作成するなど、Webからの書き込みに対してセキュリティを備えているため、Cドライブにディレクトリを作成します。


2

Flash、Java、またはSilverlightを使用する必要があります。Silverlightの場合は、分離ストレージを参照します。これにより、ユーザーのディスク上の自分のプレイグラウンドにあるファイルに書き込むことができます。ただし、遊び場の外で書くことはできません。


1

ブラウザ間でこれを行うことはできません。IEには、「信頼された」アプリケーションがActiveXオブジェクトを使用してファイルを読み書きできるようにするメソッドがありますが、それは残念なことです。

ユーザー情報を保存する場合は、ほとんどの場合Cookieを使用する必要があります。


4
そして、「信頼できる」アプリケーションになるための障壁は、正確には何ですか?確認ダイアログ?
ブルトン語

@フィリップ、それはクロスブラウザである必要があると誰も言っていません。ブラウザごとに異なるソリューションを使用できます。
Pacerier

1

ReactJSテストから、次のコードはファイルを正常に書き込みます。

import writeJsonFile from 'write-json-file';

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

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

ファイルはテストを含むディレクトリに書き込まれるため、実際のJSONファイル「* .json」に書き込むとループが作成されます。


0

セキュリティ上のリスクがあるため、JavaScriptを使用してクライアント側でファイルI / Oを実行することはできません。exeをダウンロードして実行するように依頼するか、ファイルがサーバー上にある場合は、AJAXとPHPなどのサーバー側言語を使用してサーバー側でI / Oを実行する必要があります。


1
これは質問に対する答えを提供しません。批評したり、著者に説明を求めたりするには、投稿の下にコメントを残してください。
2013年

@harpun、その通り。この回答を削除してコメントに変換してください。
Pacerier 2015年

0

JavaScriptを使用してファイルを読み書きする方法は2つあります

  1. JavaScript拡張機能の使用

  2. WebページとActive Xオブジェクトの使用


-1

これがchrome v52 +の書き込みソリューションです(ユーザーはまだ宛先doeを選択する必要があります...)
ソース: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()

クライアント側で生成された大きなデータを書き込むのに最適です。
それ以外の場合は、FileSaver.jsを使用してBlob /ファイルを保存することを勧めします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.