我现在正在努力解决的问题如下。我在远程服务器上有一个zip存档。我开发的eclipse插件使用此论坛的建议下载此存档:
//Connect readable channel to the URL
ReadableByteChannel rbc = Channels.newChannel(libraryUrl.openStream());
//Create local file
FileOutputStream fos = new FileOutputStream(libraryZipPath);
//Download the remote archive to the local file
fos.getChannel().transferFrom(rbc, 0, libraryUrl.openConnection().getContentLength());
//Close channel
fos.close();
我在服务器上有一个html文件,用于计算网页的访问统计信息。计算的javascript如下:
var data = '&r=' + escape(document.referrer) + '&n=' + escape(navigator.userAgent)
+ '&p=' + escape(navigator.userAgent) + '&g=' + escape(document.location.href);
if (navigator.userAgent.substring(0,1)>'3')
data = data + '&sd=' + screen.colorDepth + '&sw=' + escape(screen.width+'x'+screen.height);
document.write('<a href="http://www.1freecounter.com/stats.php?i=89959" target=\"_blank\">');
document.write('<img alt="Free Counter" border=0 hspace=0 '+'vspace=0 src="http://www.1freecounter.com/counter.php?i=89959' + data + '">');
document.write('</a>');
问题是:是否有可能使用此javascript或html文件来计算存档文件的下载统计信息?
答案 0 :(得分:1)
您正在使用第三方网络摄像头,它在您的网站中作为图形嵌入。当用户浏览器加载此图形时,第三方服务器会注意到该访问并递增计数器。
这对二进制下载不起作用,因为下载二进制文件时,不会要求使用webcounter图形。
您可以尝试的是让Java程序在下载二进制文件时也下载计数器图形。确保将zip存档的URL作为Referrer HTTP标头传递给映像下载,以便服务器上的脚本将其视为对其的访问权限。您必须使用URLConnection类才能设置自定义HTTP标头,如Referrer。
答案 1 :(得分:1)
谢谢你的回复,Philipp!
我已经想出如何以一种非常简单的方式使它工作。让我们考虑上面例子中的一个计数器(“http://www.1freecounter.com/stats.php?i=89959”)。该地址的计数器总共需要6个参数:
r - 文件推荐人,
n和p是用户代理,包括浏览器名称,操作系统名称,操作系统版本,浏览器版本等,
g是位置,
sd和sw是颜色深度和屏幕尺寸(对于二进制文件,我们可以跳过这两个)。
然后,我们为计数请求形成一个字符串。例如,
String cntURL = "http://www.1freecounter.com/counter.php?i=89959&r="+
URLEncoder.encode("some string for a referrer","UTF-8") + "&n="+
URLEncoder.encode("browser name (OS name OS version) browser version", "UTF-8")+"&p="+
URLEncoder.encode("the same as above", "UTF-8")+"&g=<location string>";
请注意,参数被编码为utf-8字符集。否则,计数器将无法正确计算访问权限。
然后,只使用URL类,我们创建一个URL对象并打开一个蒸汽:
URL statsUrl = new URL(cntURL);
statsUrl.openStream();
就是这样!无需研究http标头中的参数。这只是形成一个打开连接的正确字符串的问题。
我编写了一个简单的方法来检索请求所需的所有信息,并在我从服务器下载文件的方法中插入了一个调用。