web-dev-qa-db-ja.com

javascriptはファイルシステムにアクセスできますか?

答えは[〜#〜] no [〜#〜]であり、したがってGoogle Gears、Adobe AIRなどであると確信していました。

私が正しかった場合、 http://tiddlywiki.com はどのように機能しますか?永続的であり、javascriptで記述されています。また、外部(サーバー側)依存関係のない単一のHTMLファイルでもあります。 WTF?状態をどこ/どのように保存しますか?

37
Joe

Tiddlywikiには、使用するブラウザーに応じて、データを保存する方法がいくつかあります。 ソースで見ることができるように

  • ActiveXが有効な場合、Scripting.FileSystemObjectを使用します。
  • Geckoベースのブラウザーでは、UniversalXPConnectを使用しようとします。
  • Javaが有効になっている場合、TiddlySaver Javaアプレットを使用します。
  • Java LiveConnect が有効な場合、Javaのファイルクラスを使用しようとします。
46
Zr40

HTML5のFile [ 1 ]、FileWriter [ 2 ]、およびFileSystem [] APIは、Google Chromeの最新の開発者チャンネルで利用できます。 FileSystem APIを使用すると、ブラウザが認識しているスペース内のサンドボックスファイルシステムを読み書きできます。たとえば、ユーザーのローカルFSで[マイピクチャ]フォルダーを開いて読み取り/書き込みを行うことはできません。これは動作中ですが、しばらく準備ができていません。ファイルの書き込みの例:

window.requestFileSystem(
  TEMPORARY,        // persistent vs. temporary storage
  1024 * 1024,      // 1MB. Size (bytes) of needed space
  initFs,           // success callback
  opt_errorHandler  // opt. error callback, denial of access
);

function initFs(fs) {
  fs.root.getFile('logFile.txt', {create: true}, function(fileEntry) {

    fileEntry.createWriter(function(writer) {  // FileWriter

      writer.onwrite = function(e) {
        console.log('Write completed.');
      };

      writer.onerror = function(e) {
        console.log('Write failed: ' + e.toString());
      };

      var bb = new BlobBuilder();
      bb.append('Lorem ipsum');
      writer.write(bb.getBlob('text/plain'));

    }, errorHandler);
  }
}

コードスニペットについては、こちらをご覧ください HTML5ストレージスライドデッキ .

36
ebidel

次のようなJavaファイル参照を使用します。

drivers.tiddlySaver = {
        name: "tiddlySaver",
        deferredInit: function() {
            if(!document.applets["TiddlySaver"] && !$.browser.mozilla && !$.browser.msie && document.location.toString().substr(0,5) == "file:") {
                $(document.body).append("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1'height='1'></applet>");
            }
        },
        isAvailable: function() {
            return !!document.applets["TiddlySaver"];
        },
        loadFile: function(filePath) {
            var r;
            try {
                if(document.applets["TiddlySaver"]) {
                    r = document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8");
                    return (r === undefined || r === null) ? null : String(r);
                }
            } catch(ex) {
            }
            return null;
        },
        saveFile: function(filePath,content) {
            try {
                if(document.applets["TiddlySaver"])
                    return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
            } catch(ex) {
            }
            return null;
        }
    }
12
Rich Bradshaw

Javascriptはファイルシステムにアクセスできますか?

私の知る限り、上記のサンドボックスエリアの外ではありません。ただし、すべてのファイルにアクセスできる呼び出し可能なパブリックメソッドを持つ署名されたJavaアプレットにアクセスできます。

署名部分はやや複雑であり、業務上使用するためには、身元を認証するコード署名証明書の支払いが必要になる場合があります。 Verisignのような場所から入手してください。そうすれば、ユーザーは少なくともアプレットの作成者を知ることができます(それが役立つ場合)。自分で無料で署名できますが、これらの「セキュリティリスクの可能性がある」ポップアップの1つは、ユーザーによる承認のために最初に使用するときに発生します。

このようなファイル書き込み用の署名済みアプレットはダウンロード用に既に存在すると思われますが、検索で見つけることができませんでした。もしそうなら、あなたはそれをあなたのページに差し込むだけで、APIを学び、すぐに始めることができます。

4
Anon

技術的にはできます

netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserWrite');

ネットスケープ互換ブラウザ(Firefox、Mozilla、Netscape)で、ファイルシステムへのアクセスを許可するかどうかをユーザーに尋ねますが、これは移植性がありません。

*ブラウザプロセスごとに1回

4
Jason S

答えは確かにNOです。 Javaアプレット、およびこれが必要な場合は恐ろしいActiveXプラグインが通常使用されます

2
Sheff