将文件捕获到javascript变量中,而不是下载它

时间:2019-01-05 21:51:22

标签: javascript

我正在编写一个访问网站的应用程序,该应用程序可以为我提供文件链接,例如:http://www.thrustcurve.org/download.jsp?id=2199

如果我访问此链接,则会下载一个小的文本文件。相反,我想将文本捕获到javascript变量中,以便可以在其中进行搜索并提取所需的数据。

这有可能吗?

更多详细信息:尽管我很老,并且有很多编程经验,但是我在javascript / web / server / modern空间中还是个菜鸟(想想FORTRAN 77)。 我现在在教高中物理,并且正在尝试构建一个基于网络的火箭模拟器,供我的学生在自己的Chromebook上使用。 pushcurve.org的创建者已经在网上慷慨地提供了有关火箭发动机的数据,但是我需要一些只能在这些小文本文件中找到的位。也许可以使用Chrome图书上的下载文件,但是我 真的 不知道如何从那里开始。如果您有足够的耐心阅读本文,可以在noragulfa.com上看到我能完成的javascript种类。

1 个答案:

答案 0 :(得分:2)

您可以使用XMLHttpRequest来执行HTTP请求,但是由于安全限制,浏览器会阻止对“外部域”的请求(因此,您只能从您的域下载文件)。有关更多信息,请阅读有关Cross-Origin Resource Sharing (CORS)

要解决您的任务,您有几种选择:

1)从pushcurveve.org下载所需文件并将其存储在服务器上。这是最好的选择,因为您将不必依赖外部服务器(此外,热链接可能会使pushcurveve.org所有者不满意)。在这种情况下,XMLHttpRequest将能够使用相对URL访问文件:

var url = '/thrustcurve-downloads/Estes_A8.eng';

2)与pushcurve.org所有者联系,并要求他在任何地方启用Access-Control-Allow-Origin。在这种情况下,XMLHttpRequest将能够使用完整的URL访问文件:

var url = 'http://www.thrustcurve.org/download.jsp?id=2199';

3)创建一个代理,该代理将HTTP请求传递到pushcurve.org。例如,由于您正在使用nginx,因此可以简单地将以下内容添加到配置文件中:

location /thrustcurve {
    proxy_pass http://www.thrustcurve.org/;
}

在这种情况下,XMLHttpRequest将能够使用相对URL访问文件:

var url = '/thrustcurve/download.jsp?id=2199';

4)使用第三方代理(这不是一个非常可靠的解决方案,但是非常适合测试)。例如,我将使用此选项。

var url = 'http://cors-anywhere.herokuapp.com/http://www.thrustcurve.org/download.jsp?id=2199';

var xhr = new XMLHttpRequest();
xhr.onload = function () {
	console.log(xhr.response);
};

xhr.open('GET', url);
xhr.responseType = 'text';
xhr.send();

UPD::如何使用XMLHttpRequest和PHP下载文件的完整示例。

1)在根服务器上使用以下内容创建文件thrustcurve.php

<?php

// Change this to FALSE if don't want to store files locally
$store_files_locally = true;

$id = (int) filter_input(INPUT_GET, 'id');
if ($id > 0) {
    if ($store_files_locally) {
        // Specify the directory where you want to store engine files
        // It will create the directory if it doesn't exist
        $dir = __DIR__ . '/thrustcurve-downloads';
        if (!is_dir($dir) && !mkdir($dir, true, 0777)) {
            http_response_code(500);
            die('Cannot create the downloads directory');
        }

        // If file exists, load the engine from the local file
        $file = "{$dir}/{$id}.eng";
        if (is_file($file)) {
            $engine = file_get_contents($file);
            die($engine);
        }
    }

    // Download the engine file from the remote server
    $url = "http://www.thrustcurve.org/download.jsp?id={$id}";
    $engine = trim(@file_get_contents($url));

    // The downloaded file is considered valid engine only if it starts with semicolon
    if (strpos($engine, ';') === 0) {
        if ($store_files_locally) {
            file_put_contents($file, $engine);
        }

        die($engine);
    }
}

http_response_code(404);
echo "File #{$id} not found";

2)要使用JavaScript下载文件,请使用以下内容:

var xhr = new XMLHttpRequest();
xhr.onload = function () {
    if (xhr.status === 200) {
        console.log(xhr.response);
    } else {
        console.error(xhr.response);
    }
};

xhr.open('GET', '/thrustcurve.php?id=2198');
xhr.responseType = 'text';
xhr.send();