如果http响应不包含Content-Length标头,如何使用python正确下载文件?

我在appengine的send_blob()函数中遇到了这个问题,由于某种原因,该函数未在更大(20mb +)的Blob上添加Content-Length标头。

现在我正在使用urllib.urlretrieve(),但有时它不会下载整个文件。
我现在正在做什么是在下载文件之前发送内容长度,以便我可以在继续之前检查文件是否具有正确的大小。

我不确定是否有更好的方法可以做到这一点。

这些文件之一的标题:

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/octet-stream
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Date: Fri, 30 Sep 2011 19:41:34 GMT
Server: Google Frontend
Transfer-Encoding: Identity
Connection: close


我只是尝试使用wget下载带有wget --server-response --continue的文件,并且标题为:

  HTTP/1.1 200 OK
  Cache-Control: no-cache
  Content-Type: application/octet-stream
  Expires: Fri, 01 Jan 1990 00:00:00 GMT
  Date: Wed, 05 Oct 2011 14:08:13 GMT
  Server: Google Frontend
  Transfer-Encoding: chunked
Length: unspecified [application/octet-stream]

最佳答案

App Engine正在使用chunked encoding发送响应,该请求使客户端可以确定响应何时完成。 urllib应该为您处理这个问题;您的连接似乎由于某种原因而提前终止,并且urllib没有与您进行通信(或者您正在捕获并忽略该异常)。

关于python - 如果未提供Content-Length,请使用python正确下载文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7662281/

10-09 06:09
查看更多