我正在Android应用程序中进行下载,我需要获取content_length才能显示下载的百分比。
文件驻留在我的客户端已设置的服务器上。在此服务器上,对getContentLength()的调用返回-1。以下是标题:
THIS SERVERS HEADER DOESN'T WORK WITH urlConnection.getContentLength()
$ curl --head "http://www.server0.com/ango/thefile.m4v"
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=A17762C6B65FD8D35840110F8628DE4B.V5; Path=/; HttpOnly
X-ServedBy: web114
Set-Cookie: SS_MID=7315b0cb-054c-4dd8-a013-c7163793becehfjcndg8; Domain=.tangoberretin.com; Expires=Thu, 13-Apr-2023 07:57:07 GMT; Path=/
Pragma: cache
Cache-Control: private,max-age=86400
Last-Modified: Thu, 21 Feb 2013 06:28:24 GMT
Content-Disposition: attachment; filename="thefile.m4v";
Accept-Ranges: bytes
Content-Range: bytes 0-6716578/6716579
Content-Type: application/octet-stream;charset=UTF-8
Content-Length: 6716579
Date: Mon, 15 Apr 2013 07:57:07 GMT
Server: SSWS
Set-Cookie: WebPersCookie=Gn5lN9r2EIK+3eKz0tv/bEs4IJpcBzYg22jKvv/JD1eAA1N3D0pevaz3zuXOD3uTT950AQdstGRJgdE=; path=/
所以我做了一个测试并把文件放在我自己的服务器上(apache),一切正常。以下是这些标题:
THIS SERVERS HEADER WORKS WITH urlConnection.getContentLength()
$ curl --head "http://server1.net/wp-content/video/thefile.m4v"
HTTP/1.1 200 OK
Date: Mon, 15 Apr 2013 07:57:42 GMT
Server: Apache
Last-Modified: Sun, 14 Apr 2013 23:49:00 GMT
Accept-Ranges: bytes
Content-Length: 502365
Content-Type: text/plain
所以我的问题是第一个导致失败的案例,以及我该怎么办呢。理想情况下,我会将文件保留在原来的位置。
的 的 * UPDATE * *
我已经从android应用程序打印出标题,显然服务器没有为android代理发送Content-Length。我不明白...... :(
HTTP/1.1 200 OK
Accept-Ranges :
bytes
Cache-Control :
private,max-age=86400
Content-Disposition :
attachment; filename="04Left_Turning_Check_Step.m4v";
Content-Range :
bytes 0-7019776/7019777
Content-Type :
application/octet-stream;charset=UTF-8
Date :
Mon, 15 Apr 2013 08:39:06 GMT
Last-Modified :
Wed, 02 Jan 2013 18:40:09 GMT
Pragma :
cache
Server :
SSWS
Set-Cookie :
JSESSIONID=0B1D0CFFD975ED2736BFF7BBC23ACD96.V5; Path=/; HttpOnly
SS_MID=5a7bd305-4ac1-4d4d-98a3-67fa26c0db56hfje5d3d; Domain=.tangoberretin.com; Expires=Thu, 13-Apr-2023 08:39:06 GMT; Path=/
WebPersCookie=WIo8mRMTANAAke3GEsDOsONkGZoRcVvqpC4Am/pl/3WFB9hSEGH5DfGiDSKJDLc2nbZBpWFy3/Yfb3s=; path=/
Transfer-Encoding :
chunked
Vary :
Accept-Encoding
X-Android-Received-Millis :
1366015147201
X-Android-Sent-Millis :
1366015146842
X-ServedBy :
web115
答案 0 :(得分:1)
关键是以下内容:
Transfer-Encoding :
chunked
分块传输编码描述为here。
简而言之,分块传输编码允许服务器以一系列块发送大量内容,而无需先在发送之前确定内容的大小。这使得服务器可以更加高效地从存储中加载内容,以便将其发送到客户端。
我认为您需要与您的客户交谈,并告诉他如果服务器在响应标头中提供有效,准确的内容长度,那么您可以提供进度报告,但否则您不能。或者,您是否能够初始请求获取有关内容的信息(包括内容大小),然后再对内容本身发出第二次请求?如果是,那么您就可以提供进度报告。
答案 1 :(得分:0)
旧帖子,但Mark的解释帮助我指出了我的解决方案。
使用以下调用拨打网址。这允许在服务器进入“Chunked”模式的情况下返回内容长度。
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse execute = client.execute(httpGet);
int contentLength = (int)execute.getEntity().getContentLength();
然后,您可以使用URLConnection重新生成请求,并使用已返回的内容长度进行计算