【问题标题】:Android HttpURLConnection content lengthAndroid HttpURLConnection 内容长度
【发布时间】:2014-03-04 08:26:59
【问题描述】:

我正在尝试从 android 中的服务器下载文件并使用与answer provided in this thread 非常相似的代码显示进度对话框,但我无法在HttpURLConnectiongetContentLength() 方法中获取内容长度。所有文件的内容长度为 -1。

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

这些方法获取 http 连接/响应的内容长度的方式有什么基本区别吗?

编辑 1:

按照建议的一些答案和 cmets 尝试了以下几件事。

  1. Accept-Encoding 标头设置为identity
  2. 获取内容长度为字符串(来自标头字段Content-Length),然后将其转换为长字符串
  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);

【问题讨论】:

  • @R4j 我检查了链接。我试过了,但没有用。该链接中的答案对于返回正确内容长度但对于 int 而言太大的 httprequests 更有效。我没有得到任何内容长度。
  • 根据网络服务器、协议、连接或下载方法,Content-length 可能并不总是可用。但是对于您的情况,我认为您应该像 ios 一样发出请求(检查您的标题,内容类型......)。或者也许你应该提供你的 ios 代码然后人们可以帮助你。

标签: android ios httpconnection content-length


【解决方案1】:

试试这个:

   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   conn .setRequestProperty("Accept-Encoding", "identity");
   conn.connect();

【讨论】:

  • 为我工作!!!就我而言,这是服务器更新的问题,当编码为 gzip 时服务器没有发送 content-length 标头。
【解决方案2】:

如果你只需要内容长度,你可以试试

  conn.getContent().toString().length()

conn 是 HttpURLConnection 对象

【讨论】:

  • 使用这种方法,我也得到 -1 作为内容长度。
  • 这意味着没有内容长度,我认为您的问题不在内容长度上。这是连接的方式。正如您所提到的,您通过 ISO 获得了文件并阅读了内容。这意味着您在进行连接之前忘记在标题中设置某些内容,或者您​​设置错误。
【解决方案3】:

这个问题的根本原因原来是 Cookie。

我在我的应用程序的一项活动中使用 Web 视图。某些 cookie 由 Web 视图存储。所有其他 REST api 和文件下载请求都可以在没有这些 cookie 的情况下工作,但是对于特定类型的请求,cookie 是必需的。

显然,android web 视图和连接请求不会像 iOS 那样共享开箱即用的 cookie。因此,我不得不更改我的代码以确保 HttpUrlConnection 使用 WebKit 的 cookie 存储。我是使用method described in the accepted answer for this question 完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2011-10-27
    • 2012-12-07
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多