我正在开发一款应用程序,它应该(相当精确地)衡量网页的大小。
我现在正在努力的是我需要知道网站上特定文件的大小。我有一个URL数组,我尝试获取其标题以获取Content-Length,但是一些文件返回-1,因为它们是分块的。如果它们返回-1,我会尝试下载它们以获得它们的大小。
这就是问题所在 - 我发现我总是得到文件的未压缩版本。
示例文件 - http://www.google-analytics.com/analytics.js
当我在Chrome中打开它时,标题会显示:
但是,当我使用HttpURLConnection下载它时,它的大小为25421字节,当我检查Content-Encoding标头时,它总是为空。
connection = (HttpURLConnection)(new URL(url)).openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.connect();
int contentLength = connection.getContentLength();
if (contentLength == -1 && connection != null) {
InputStream input = connection.getInputStream();
byte[] buffer = new byte[4096];
int count = 0, len;
while ((len = input.read(buffer)) > 0) {
count += len;
}
contentLength = count;
}
所以问题是,我用我的应用程序下载了一个网页,并说它有(比方说)400kB。但是当我使用某种工具(如http://tools.pingdom.com/fpt/)下载它时,大小要小得多,比如100kB,因为大多数脚本都是gzip压缩的,这意味着传输速度较低。 我知道300kB并不是那么多,但是当你使用移动传输时,每个kB都很重要,我希望我的应用程序是精确的。
你能指出我哪里弄错了,或者我怎么能解决这个问题? 谢谢
答案 0 :(得分:1)
您的HttpURLConnection设置代码对我来说是正确的。您可以尝试将User-Agent设置为标准浏览器,也许服务器试图比它应该更加智能。如果做不到这一点,请通过调试代理(如Fiddler或Burp)运行流量,以查看网络级别的情况。
答案 1 :(得分:0)
如果您使用的是iJetty,则必须首先启用gzip压缩
您必须启用GzipFilter才能使Jetty返回压缩内容。看看如何做到这一点:http://blog.max.berger.name/2010/01/jetty-7-gzip-filter.html
您还可以使用gzip init参数使Jetty搜索压缩内容。这意味着如果请求文件file.txt,Jetty将监视名为file.txt.gz的文件并返回该文件。