繁体   English   中英

如果未提供Content-Length,请使用python正确下载文件

[英]download a file properly with python if no Content-Length is provided

如果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]

如果服务器未提供所请求数据长度的指示,向您发送了一些数据,然后关闭了连接,则HTTP客户端必须假定所有数据都已成功传输。

仅使用附加的非HTTP信息(例如有效载荷格式中的校验和或其他错误纠正), 应用程序才能确定是否已发生错误,并在后续操作中使用HTTP Range标头 (即Range: bytes=NNNN- )。客户要求恢复传输。

如果服务器不支持Range标头,那么您可以在服务器随时发送响应标头Accept-Ranges: none情况下得出结论,据我所知,您无权追索损坏的服务器实现,只能定期重试希望它最终能够提供通过错误检测的响应的请求。

脚注:提供blob内容时缺少Content-Length标头对我来说并不奇怪。 许多数据库API不允许在不实际检索整个对象的情况下测试blob的长度。 我怀疑这是因为SQL引擎本身对此测试缺乏支持。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM