我正在尝试开发简单的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
答案 0 :(得分:0)
当您获得 200(OK)而不是206(部分 内容),您的范围检索请求不满足。
来自W3文档:
- 无条件GET中存在Range标头会修改 如果GET成功则返回什么。其他 单词,响应的状态代码为206(部分 内容)而不是200(OK)。
更多详情:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2
您必须检查服务器端日志以了解其失败的原因。
当你获得200(OK)时,检查Response头中的Accept-Ranges: bytes
标题。 Accept-Ranges
响应标头表示服务器具有范围标头支持。
检查here由johnstok解释的Chrome和静态网络服务器之间的请求 - 响应交换。