我第一次不得不在这里问一个问题,因为我总是能够找到答案。我不知道 Java 或 .jnlp 文件是如何工作的。
项目背景
当人们点击下载文件时,我的网站上有一个网页会加载一个空白页面。然后,此空白页面加载 .jnlp 文件,该文件在用户启动时执行 java 代码。不幸的是,许多用户很难理解发生了什么。我的任务是将下载的内容打包到我们的 Magento 系统中,并添加说明,以便人们知道他们在哪里。
问题
一切都按预期工作。唯一的例外是 .jnlp 文件在启动时显示错误“无法启动应用程序”。问题是整个网站的内容都被写入文件,这导致它失败。我发现的唯一解决方法是在新的空白窗口中启动 .jnlp 文件......这违背了我打算做的事情的目的。
问题
有没有办法在页面上启动 .jnlp 文件而不必打开新选项卡或页面为空白(尽管是 .jnlp 启动代码)?
编码
以下是用于启动 .jnlp 文件的代码:
<?php
$map_name = isset($_GET['name']) ? filter_var($_GET['name'], FILTER_SANITIZE_STRING ) : redirect();
$map_version = isset($_GET['version']) ? filter_var($_GET['version'], FILTER_SANITIZE_NUMBER_INT ) : redirect();
$expiration = (time() + (2*24*60*60)) * 1000;
$java = isset($_GET['java']) ? filter_var($_GET['java'], FILTER_SANITIZE_STRING ) : "false";
// check if java is ready, then execute the chip updater
if( $java == "ready" ){
// load jnlp template
$dom = new DOMdocument('1.0', 'utf-8');
$dom->formatOutput = true;
$dom->load('template.jnlp.php');
$node = $dom->getElementsByTagName("application-desc")->item(0); // locate the start place and prep for insertion
// map name attribute
$var = $dom->createElement("argument", base64_encode($map_name)); // place a new argument tag and place an encoded name there
$node->appendChild($var);
// map version attribute
$var = $dom->createElement("argument", base64_encode($map_version)); // place a new argument tag and place an encoded version there
$node->appendChild($var);
// set expiration attribute
$var = $dom->createElement("argument", base64_encode($expiration)); // place a new argument tag and place an encoded expiration time there
$node->appendChild($var);
// output jnlp mime header and force download=
header("Content-Type: application/x-java-jnlp-file");
header("Content-Disposition: attachment; filename=update.jnlp");
//header("Content-Type: text/xml");
// output xml content
echo $dom->saveXML();
//echo $dom->saveXML($node);
} // end
else{
echo <<<EOD
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head></head>
<body>
<script src="http://www.java.com/js/deployJava.js" type="text/javascript"><!-- // --></script>
<script type="text/javascript">
if (deployJava.versionCheck('1.6') || deployJava.versionCheck('1.7')) {
var str = location.href;
var z = str.replace("https://","http://");
var n = z.replace("?download=1","");
var url = n + "&java=ready";
window.location = url; // possibly replace with = ((location.href).replace("?download=1","")) + "&java=ready"
}
else{
alert("We have detected that you either do not have Java installed, or that it may be an older version. We are redirecting you to the Java download site where you will be able to install the newest version of Java. <!!! -- If the window does not load, you may need to allow popups from our site. Please watch for a popup warning and allow it to then relaunch! -- !!!>");
var url="./update2.php";
window.open(url);
window.history.back();
}
</script>
</body>
</html>
EOD;
}
注意:我知道有一些不好的做法,例如使用 $_GET() 而不是 $_POST(),由于系统设置的方式,这需要时间来修复。我也了解 DOM 对象正在从我的网页中抓取所有内容,如果我在系统框架的同一页面上使用此代码,则会导致错误。这段代码是在我加入公司之前开发的,我正在尝试查看是否可以对其进行调整以使其工作,或者是否需要采用不同的方法。
我很感激你可以分享的任何意见。谢谢!