将文件从Apache提供给Javascript

时间:2017-11-17 23:35:09

标签: javascript node.js ajax apache web-services

我正在用Javascript和WebGL编写我的第一个Web应用程序。现在我在Apache的localhost上运行应用程序。该应用程序需要处理即时提供的数据。到目前为止,我使用的是在运行时发生的AJAX调用,这些调用不再适用于我的目的。因此,当被问到时,我希望应用程序在初始化时将所有文件从服务器端加载到客户端,而不是从服务器到客户端提供单个文件(我希望这在开始时自动发生,所以我不必添加每个新文件将文件作为html索引中的url)。我知道我应该使用Server Side脚本执行此操作;可能是PHP,因为我有一个Apache localhost?我有不同的文件夹,它们在统一的数据格式(.txt,.png和.json)中保存我所需的资源。所以我想要做的是,在Javascript应用程序启动之前,查看文件夹并在每个文件夹中发送一个对象,该文件夹将文件名作为绑定到filedata的键。我的直觉是正确的,我需要用PHP做到这一点吗?如果是的话,我在哪里开始告诉我的应用程序什么时候做(首先开始用php提供文件,然后启动javascript应用程序)?我如何在localhost上执行此操作?我是否应该考虑扩展我的工具集(例如在ServerSide上使用nodeJS(现在是本地))?如果是这样,你为这种工作提出了什么样的轻量级工具?我觉得我在这里缺少一些设计原则。

编辑: 请记住,我不想专门调用单个文件...我已经这样做了。我需要的是一个脚本,它在应用程序初始化时自动将服务器上某个文件夹的所有文件提供给客户端,然后才开始实际应用程序的程序逻辑。

1 个答案:

答案 0 :(得分:1)

你的问题有点广泛,所以我会尽我所能。为什么AJAX不能用于实时数据但是一次加载所有文件呢?如果您正在使用实时数据,为什么不查看websocket或者至少是AJAX查询?

如果要将数据从服务器传递到客户端,无论如何都需要使用HTTP请求。客户端需要GET请求或POST请求才能从服务器请求数据并将其作为响应接收。

理论上,您可以直接将数据从PHP直接传递到应用程序的视图(无论何时用户从服务器请求诸如.php文件等数据,技术上都是通过GET请求完成的)但这并不像如果Javascript有权访问数据。您可以使用一些.value方法执行一些黑客操作并将数据从视图“传输”到Javascript,但这并不理想,并且可能容易出现一些安全漏洞。这也意味着数据只被传递一次。

所以需要做的是,数据需要在初始化时处理,然后通过使用Javascript和HTTP请求立即传输到客户端。

因此,如果您希望Javascript能够访问数据并在变量中使用它或进一步操作它,那么您需要使用Javascript调用的HTTP请求,如GET或POST。否则,您需要在初始化(通过PHP)时立即将数据传递给视图,但这意味着您无法使用实时数据,因为数据仅在页面刷新时传递一次。

scandir()的示例:

<?php
//scandir() returns filenames, not data from files
$fileArray = scandir('datafolder/') //this is a relative path reference to the folder 'datafolder'
$finalArray = [];

foreach($fileArray as $filename){
    tempArray = [];
    $file = fopen('datafolder/' . $filename, 'r'); //im pretty sure scandir only retrieves the filenames and not the path, so you might need to append the filepath so your script knows where to look
    $tempArray = fgetcsv($file, 1024); //temp array to hold contents of each iteration of foreach loop
    array_push($finalArray, $tempArray); //this will store the data for later use
}

或者可以使用数据,具体取决于它是什么。比如,如果您需要组合来自多个.csv文件的数据,您可以读取每个文件并将其附加到单个数组。如果要读取多个不同的文件并保持每个文件的独立性,可以创建多个数组,然后将包含每个文件数据的单个JSON编码对象作为对象的单独属性传回,如:

{
    'dataOne': [0,1,2,3,4,5,6...],
    'dataTwo': ['new', 'burger', 'milkshake'],
    'dataThree': ['Mary', 'Joe', 'Pam', 'Eric']
}

可以使用以下方法之一使用PHP关联数组创建:

//assuming $arrayOne is already assigned from reading a file and storing its contents within $arrayOne
$data['dataOne'] = $arrayOne;
// or
array_push($data['dataTwo'], $arrayTwo);
// or
array_push($data, [
   'dataThree'  => ['Mary', 'Joe', 'Pam', 'Eric']
]);

然后可以简单地传回$data,这是一个包含所有不同数据集的单个数组,如果每个集合都需要是不同的。