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 保留在用户本地系统上的一个折衷方案是,这些 cookie 通常用于保存少量数据(通常是用户名、创建日期和 cookie 的到期日期等),并且取决于用户的本地计算机。此外,虽然您可以从 JavaScript 中提取这些 cookie 中的数据,但您又回到了最初的问题:数据仍然存在于网络上,而不是服务器文件系统上的输出文件中。如果您需要提取数据并希望保证这些数据将存在于您的机器上,请使用 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 而言,他们自己的网站(php.net/{functionName}) 非常丑陋,但确实包含很多信息的也...

于 2013-04-27T20:10:19.390 回答