我正在编写一个访问网站的应用程序,该应用程序可以为我提供文件链接,例如:http://www.thrustcurve.org/download.jsp?id=2199
如果我访问此链接,则会下载一个小的文本文件。相反,我想将文本捕获到javascript变量中,以便可以在其中进行搜索并提取所需的数据。
这有可能吗?
更多详细信息:尽管我很老,并且有很多编程经验,但是我在javascript / web / server / modern空间中还是个菜鸟(想想FORTRAN 77)。 我现在在教高中物理,并且正在尝试构建一个基于网络的火箭模拟器,供我的学生在自己的Chromebook上使用。 pushcurve.org的创建者已经在网上慷慨地提供了有关火箭发动机的数据,但是我需要一些只能在这些小文本文件中找到的位。也许可以使用Chrome图书上的下载文件,但是我 真的 不知道如何从那里开始。如果您有足够的耐心阅读本文,可以在noragulfa.com上看到我能完成的javascript种类。
答案 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();