Android HttpURLConnection内容长度



我正试图从android中的服务器下载文件,并使用与本线程中提供的答案非常相似的代码显示进度对话框,但我无法在HttpURLConnectiongetContentLength()方法中获得内容长度。所有文件的内容长度为-1。

对于同一个文件,我在iOS应用程序中使用NSHTTPURLResponseexpectedContentLength方法获得正确的内容长度。

这些方法获取http连接/响应的内容长度的方式是否存在一些基本差异?

编辑1:

试着按照建议做以下几件事——一些答案和评论。

  1. Accept-Encoding标头设置为identity
  2. 以字符串形式获取内容长度(来自标头字段Content-Length),然后将其转换为long
  3. 尝试使用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存储。我使用了这个问题公认答案中描述的方法。

相关内容

  • 没有找到相关文章

最新更新