【发布时间】:2014-03-04 08:26:59
【问题描述】:
我正在尝试从 android 中的服务器下载文件并使用与answer provided in this thread 非常相似的代码显示进度对话框,但我无法在HttpURLConnection 的getContentLength() 方法中获取内容长度。所有文件的内容长度为 -1。
对于同一个文件,我使用NSHTTPURLResponse 的expectedContentLength 方法在iOS 应用程序中获得正确的内容长度。
这些方法获取 http 连接/响应的内容长度的方式有什么基本区别吗?
编辑 1:
按照建议的一些答案和 cmets 尝试了以下几件事。
- 将
Accept-Encoding标头设置为identity - 获取内容长度为字符串(来自标头字段
Content-Length),然后将其转换为长字符串 - 尝试使用
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