首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取pdf的大小而不下载

获取pdf的大小而不下载
EN

Stack Overflow用户
提问于 2014-06-22 13:24:11
回答 2查看 2K关注 0票数 3

是否有可能知道pdf的大小,例如http://example.com/ABC.pdf在python中使用请求模块而不实际下载它。我正在编写一个应用程序,如果网络速度慢,如果pdf的大小很大,那么它将推迟下载。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-22 13:25:58

使用HEAD请求

响应应在头文件中提供更多要下载的文件的详细信息,而无需获取完整的文件。

代码语言:javascript
复制
>>> url = "http://www.pdf995.com/samples/pdf.pdf"
>>> req = requests.head(url)
>>> req.content
''
>>> req.headers["content-length"]
'433994'

或者尝试流读取

代码语言:javascript
复制
>>> req = requests.get(url, stream=True)
>>> res = req.iter_content(30)
>>> res
<generator object generate at 0x7f9ad3270320>
>>> res.next()
'%PDF-1.3\n%\xc7\xec\x8f\xa2\n30 0 obj\n<</Len'
>>> res.next()
'gth 31 0 R/Filter /FlateDecode'
>>> res.next()
'>>\nstream\nx\x9c\xed}\xdd\x93%\xb7m\xef\xfb\xfc\x15S\xf7%NU\xf6\xb8'

然后,您可以从初始pdf文件字节中解码pdf大小,并决定是否继续。

使用范围请求标头

HTTP只允许要求检索字节的范围。

如果您的服务器支持这一点,您可以使用技巧,您可以要求范围的字节,只有在太大的文件可用。如果你得到一些字节(状态是好的),你知道,文件太大了。

如果您得到一个异常ChunkedEncodingError: IncompleteRead(0 bytes read),那么您知道,文件会更小。

就这样说吧:

代码语言:javascript
复制
>>> headers = {"Range": "bytes=999500-999600"}
>>> req = requests.get(url, headers=headers)

如果您的服务器允许提供部分内容,这将只起作用。

票数 9
EN

Stack Overflow用户

发布于 2014-06-22 13:29:01

像这样

代码语言:javascript
复制
import urllib2
response = urllib2.urlopen('http://example.com/ABC.pdf')
size_of_pdf = response.headers['Content-Length']

在调用response.read()之前,不会下载内容。

看看Response Headers in 维基百科

代码语言:javascript
复制
...
Content-Length  The length of the response body in octets (8-bit bytes) Content-Length: 348 Permanent
...

OP要求使用requests,所以@JanVlcinsky的答案更合适。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24351677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档