0

javascript ファイルがあるローカル ディレクトリのテキスト ファイルに書き込む関数を JavaScript に追加したいと考えています。これは、ユーザーのファイル システムにアクセスする安全でない方法を探しているわけではないことを意味します。私が気にかけているのは、ユーザーの入力を JavaScript によってアクセスされる html ページに抽出し、その入力を外部のデータとして使用することだけです。シンプルなテキストファイルが必要です。ちなみに、このユーザー入力は実際にはテキストではありませんが、オンライン ゲームのコンポーネントを使用して、基盤となる JavaScript がテキスト文字列に変換する一連のアクションです (したがって、この特定の文字列は保存したいものであり、実際には直接的なものではありません)。ユーザー)。

ユーザーのファイル システムに書き込みたいのではなく、javascript (および html) コードが配置されているファイル (サーバーでホストされているフォルダー) に書き込みます。ファイル I/O を実行する簡単な方法はありますか?

Javascript には FileReader があることは知っていますが、これを逆にする方法はありますか? FileWriter のように。GoogleClosure には FileWriter があるように見えますが、まったく機能していないようで、これを行う方法の適切な例が見つかりません。

これに別の言語が必要な場合、関連するスニペットを取得して、これを Javascript ファイルに挿入する方法はありますか? (それが役立つ場合、フォルダーは Linux システムでホストされます)

補遺: 以下の Elias Van Ootegem のソリューションは優れており、クライアントとサーバーの相互作用の優れた例であり、抽出しようとしているデータをシステムに提供させることを強くお勧めします。労働者はかなり面白いです。

しかし、私が最初に JavaScript I/O について持っていたのと同様の質問でこの投稿を見ている人のために、ケースに応じて別の回避策を見つけました。私のチームのプロジェクト サイトでは、ユーザーが [保存] ボタンを押した場合にユーザーの対話データの一部を保存するデータベース サイト、MongoDB を利用しました。MongoDB およびその他のオンライン データベース システムは、ローカル マシン/サーバーから呼び出してそのデータを出力ファイルに入れることができる "ダンプ" 関数/スクリプトを提供します (JSON データをテキスト ファイルに入れることができました)。MongoDB などのデータベースでは、テキストがどのような形式になるか (非常に構造化され、整理されている) が明確に示されているため、その出力から必要なデータを抽出してフォーマットするパーサーを作成できます。

オプションとして Cookie を残すことも検討し、テスト プログラムを使用して試してみました (これも機能します!)。ただし、Cookie をユーザーのローカル システムに残すことのトレードオフの 1 つは、通常、これらの Cookie は少量のデータ (通常はユーザー名、作成日、Cookie の有効期限など) を保持することを意図しており、ユーザーのローカル マシンに依存することです。さらに、これらの Cookie のデータを JavaScript から抽出することはできますが、最初の問題に戻ります。データは、サーバーのファイル システムの出力ファイルではなく、Web 上にまだ存在します。データを抽出する必要があり、このデータがマシンに存在することを保証したい場合は、Elias Van Ootegem のソリューションを使用してください。

4

1 に答える 1

1

クライアント側で実行されている JavaScript コードは、サーバーのファイルシステムに同時にアクセスすることはできません。まして、ファイルを書き込むことはできません。JS に IO 機能があるとしたら、それはかなり安全ではないとよく言われます...それがどれほど危険か想像してみてください。

あなたができることは、Worker閉じるときに完全なデータ文字列を返し、サーバーに送信される(AJAX呼び出し)を使用して、文字列を作成することです。
サーバー側のスクリプト (Perl、PHP、.NET、Ruby...) は、このデータを受け取り、解析してから、必要に応じてファイルをディスクに書き込むことができます。
全体として、それほど難しくはありませんが、とにかく非常に興味深いプロジェクトです。ああ、ワーカーを使用する場合、それがオンライン ゲームとすべてのものであることを考えるとsetInterval、データ (の一部) を毎回送信する5000msことも悪い考えではないかもしれません。

リクエストに応じて - いくつかの基本的なコード スニペット。
シンプルな AJAX セットアップ関数:

function getAjax(url,method, callback)
{
    var ret;
    method = method || 'POST';
    url = url || 'default.php';
    callback = callback || success;//assuming you have a default function called "success"
    try
    {
        ret = new XMLHttpRequest();
    }
    catch (error)
    {
        try
        {
            ret= new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(error)
        {
            try
            {
                ret= new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(error)
            {
                throw new Error('no Ajax support?');
            }
        }
    }
    ret.open(method, url, true);
    ret.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    ret.setRequestHeader('Content-type', 'application/x-www-form-urlencode');
    ret.onreadystatechange = callback;
    return ret;
 }
 var getRequest = getAjax('script.php?some=Get&params=inURL', 'GET');
 getRequest.send(null);
 var postRequest = getAjax('script.php', 'POST', function()
 {//passing anonymous function here, but this could just as well have been a named function reference, obviously...
    if (this.readyState === 4 && this.status === 200)
    {
         console.log('Post request complete, answer was: ' + this.response);
    }
 });
 postRequest.send('foo=bar');//set different headers to pos JSON.stringified data

ここは、上記のコードから得られない情報を読むのに適した場所です。これは、コードのほとんどをコピーして貼り付けただけですが、もう少し学習したい場合は、ここでそれを行うのに最適な場所です

WebWorkers
現在、これらは非常に新しいため、それらを使用すると、古いブラウザーをサポートできないことを意味します (イベント リスナーを使用してデータの各部分をサーバーに送信することでサポートできますが、ワーカーを使用すると、バンドル、前処理を行うことができますスクリプトの「通常の」フローをブロックすることなく、データを構造化します. ワーカーは、マルチスレッド JavaScript コードをソートする手段として提示されることがよくあります.ここにそれらの良い紹介が
あります. 基本的に、次のようなものをあなたのスクリプト:

var worker = new Worker('preprocess.js');//or whatever you've called the worker
worker.addEventListener('message', function(e)
{
     var xhr = getAjax('script.php', 'post');//using default callback
     xhr.send('data=' + e.data);
     //worker.postMessage(null);//clear state
}, false);

次に、ワーカーは次のように開始できます。

var time, txt = '';
//entry point:
onmessage = function(e)
{
    if (e.data === null)
    {
        clearInterval(time);
        txt = '';
        return;
    }
    if (txt === '' && !time)
    {
        time = setInterval(function()
        {
            postMessage(txt);
        }, 5000);//set postMessage to be called every 5 seconds
    }
    txt += e.data;//add new text to current string...
}

サーバー側では、これほど簡単なことはありません。

if ($_POST && $_POST['data'])
{
    $file = $_SESSION['filename'] ? $_SESSION['filename'] : 'File'.session_id();
    $fh = fopen($file, 'a+');
    fwrite($fh, $_POST['data']);
    fclose($fh);
}
echo 'ok';

現在、このコードはすべて少し粗雑で、現在の形式では使用できない場合がほとんどですが、始めるには十分なはずです。何かわからないことがあればググってみてください。
ただし、JS に関して言えば、MDNが最も優れたリファレンスであり、PHP に関する限り、MDNのサイト(php.net/{functionName}) はかなり醜いですが、多くの情報が含まれていることを覚えておいてください。情報も…

于 2013-04-27T20:10:19.390 に答える