我第一次在这里问一个问题,因为我总能找到答案。我不知道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对象正在抓取我网页上的所有内容,如果我在系统框架的同一页面上使用此代码,则会导致错误。这段代码是在我加入公司之前开发的,我试图看看我是否可以调整它以使其工作,或者是否需要采用不同的方法。
感谢您分享的任何意见。谢谢!
答案 0 :(得分:0)
我想出来了。在这种情况下,我仍然需要在一个单独的页面中打开它 - 这确实打败了为什么构建它的目的。但是,我使用<iframe>
,它允许我正确运行文件。我发现如果我使用display:none隐藏<iframe>
,它仍会正确下载.jnlp文件。
所以,如果有人遇到过类似的解决方案,那就有一种方法。如果有人知道,我会有兴趣以不同的方式学习。