Android通过HttpConnection获取文件长度

时间:2016-12-30 04:29:30

标签: android httpconnection

我正在尝试开发简单的android下载管理器,在这个库中我通过两种方法从http连接获取文件长度,如下代码:

String contentLength = httpConnection.getHeaderField("Content-Length");
if (TextUtils.isEmpty(contentLength) || contentLength.equals("0") || contentLength.equals("-1")) {
    length = httpConnection.getContentLength();
} else {
    length = Long.parseLong(contentLength);
}

当我在

上获得206时,此代码正常工作
httpConnection.getResponseCode();

但是当我得到200

if (TextUtils.isEmpty(contentLength) || contentLength.equals("0") || contentLength.equals("-1")) {

false

httpConnection.getContentLength();

返回0

我的代码完整部分:

try {
    httpConnection = (HttpURLConnection) url.openConnection();
    httpConnection.setConnectTimeout(Constants.HTTP.CONNECT_TIME_OUT);
    httpConnection.setReadTimeout(Constants.HTTP.READ_TIME_OUT);
    httpConnection.setRequestMethod(Constants.HTTP.GET);
    httpConnection.setRequestProperty("Range", "bytes=" + 0 + "-");
    final int responseCode = httpConnection.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK) {
        parseResponse(httpConnection, false);
    } else if (responseCode == HttpURLConnection.HTTP_PARTIAL) {
        parseResponse(httpConnection, true);
    } else {
        throw new DownloadException(DownloadStatus.STATUS_FAILED, "UnSupported response code:" + responseCode);
    }
} catch (ProtocolException e) {
    throw new DownloadException(DownloadStatus.STATUS_FAILED, "Protocol error", e);
} catch (IOException e) {
    throw new DownloadException(DownloadStatus.STATUS_FAILED, "IO error", e);
} finally {
    if (httpConnection != null) {
        httpConnection.disconnect();
    }
}

这是我下载和获取文件长度的测试链接

http://wallpaperwarrior.com/wp-content/uploads/2016/09/Wallpaper-16.jpg

1 个答案:

答案 0 :(得分:0)

当您获得 200(OK)而不是206(部分         内容),您的范围检索请求不满足。

来自W3文档:

  
      
  • 无条件GET中存在Range标头会修改   如果GET成功则返回什么。其他   单词,响应的状态代码为206(部分   内容)而不是200(OK)。
  •   

更多详情:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

您必须检查服务器端日志以了解其失败的原因。

EDIT1

当你获得200(OK)时,检查Response头中的Accept-Ranges: bytes标题。 Accept-Ranges响应标头表示服务器具有范围标头支持。

检查here由johnstok解释的Chrome和静态网络服务器之间的请求 - 响应交换。