java - Android Http ContentLength 始终为 -1

标签 java android http content-length

我需要一种方法来确定 Internet 上文件的大小。这是我的方法:

    private int getSize(String url){
    try {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        //connection.setConnectTimeout(TIMEOUT);
        //connection.setReadTimeout(TIMEOUT);
        //connection.setRequestMethod("HEAD");
        int responseCode = connection.getResponseCode();
        int size = connection.getContentLength();

        if(responseCode != 200){
            Log.e(LOG_TAG, "Fehlercode: " + responseCode + " beim Ermitteln der Dateigroesse von " + url);
            return -1;
        }

        return size;            
    } catch (IOException e) {
        Log.e(LOG_TAG, "Fehler beim Ermitteln der Dateigroesse von " + url, e);
        return -1;
    }
}

对于 Java(桌面),该方法有效 - 在 Android 上则无效。 这有什么问题吗?

感谢您的帮助!

最佳答案

HttpURLConnection和服务交互使用“gzip”压缩(android2.2及更高版本) 你应该设置:

connection.setRequestProperty("Accept-Encoding", "identity");

引用API: 默认情况下,HttpURLConnection 的此实现请求服务器使用 gzip 压缩。由于 getContentLength() 返回传输的字节数,因此您无法使用该方法来预测可以从 getInputStream() 读取多少字节。相反,读取该流直到耗尽:whenread() 返回 -1。

关于java - Android Http ContentLength 始终为 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25682102/

相关文章:

java - 如何管理JCA ManagedConnectionFactory的生命周期?

android - Android Studio 中的 Gradle 需要 HTTPS 连接

asp.net-mvc - 使用 RestSharp 将多个参数发布到 webapi

java - 使用 Kotlin 进行带参数的回调

java - Lambdaj 类类型转换

java - 使用 float 作为 map 的键

android - 地理围栏和 Lollipop

android - Firebase FCM 强制 onTokenRefresh() 被调用

python - "No module named ' http_server '"尝试在 networkx 中导入 http_server 时

c - 用 C 重建从 HTTP 代理服务器到远程服务器的请求 header