我正试图从android中的服务器下载文件,并使用与本线程中提供的答案非常相似的代码显示进度对话框,但我无法在HttpURLConnection
的getContentLength()
方法中获得内容长度。所有文件的内容长度为-1。
对于同一个文件,我在iOS应用程序中使用NSHTTPURLResponse
的expectedContentLength
方法获得正确的内容长度。
这些方法获取http连接/响应的内容长度的方式是否存在一些基本差异?
编辑1:
试着按照建议做以下几件事——一些答案和评论。
- 将
Accept-Encoding
标头设置为identity
- 以字符串形式获取内容长度(来自标头字段
Content-Length
),然后将其转换为long - 尝试使用
conn.getContent().toString().length()
而不是getContentLength()
这些对我都不起作用。
最让我困惑的是,我在iOS中获得了内容长度,但在android上没有。
编辑2:
这是我的iOS和Android代码进行比较-
iOS:
NSURLRequest *request = [NSURLRequest requestWithURL:self.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1200.0];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
安卓:
URL url = new URL(downloadUrlString);
connection = (HttpURLConnection) url.openConnection();
connection .setRequestProperty("Accept-Encoding", "identity");
connection.connect();
我能看到的唯一区别是缓存。所以我在android代码中也添加了以下行,但没有任何变化。
connection.setUseCaches(true);
试试这个:
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn .setRequestProperty("Accept-Encoding", "identity");
conn.connect();
如果你只需要内容长度,你能尝试吗
conn.getContent().toString().length()
其中conn是HttpURLConnection对象
导致此问题的根本原因是Cookies。
我正在应用程序中的一个活动中使用web视图。一些cookie由web视图存储。所有其他RESTapi和文件下载请求都可以在没有cookie的情况下工作,但对于特定类型的请求,cookie是必要的。
显然,android网络视图和连接请求不像iOS那样开箱即用地共享cookie。因此,我不得不对代码进行更改,以确保HttpUrlConnection使用WebKit的cookie存储。我使用了这个问题公认答案中描述的方法。