Я загружаю файл, используя Python urllib2. Как проверить размер файла? - PullRequest
9 голосов
/ 28 октября 2009

А если он большой ... тогда остановить загрузку? Я не хочу загружать файлы размером более 12 МБ.

request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()

Ответы [ 4 ]

20 голосов
/ 28 октября 2009

Нет необходимости, как bobince , и перейдите на httplib. Вы можете сделать все это с помощью urllib напрямую:

>>> import urllib2
>>> f = urllib2.urlopen("http://dalkescientific.com")
>>> f.headers.items()
[('content-length', '7535'), ('accept-ranges', 'bytes'), ('server', 'Apache/2.2.14'),
 ('last-modified', 'Sun, 09 Mar 2008 00:27:43 GMT'), ('connection', 'close'),
 ('etag', '"19fa87-1d6f-447f627da7dc0"'), ('date', 'Wed, 28 Oct 2009 19:59:10 GMT'),
 ('content-type', 'text/html')]
>>> f.headers["Content-Length"]
'7535'
>>> 

Если вы используете httplib, вам, возможно, придется реализовать обработку перенаправления, поддержку прокси и другие приятные вещи, которые urllib2 делает для вас.

7 голосов
/ 28 октября 2009

Можно сказать:

maxlength= 12*1024*1024
thefile= urllib2.urlopen(request).read(maxlength+1)
if len(thefile)==maxlength+1:
    raise ThrowToysOutOfPramException()

но, разумеется, вы все равно прочитали 12 МБ нежелательных данных. Если вы хотите свести к минимуму риск этого, вы можете проверить заголовок HTTP Content-Length, если таковой имеется (может и не быть). Но чтобы сделать это, вам нужно опуститься до httplib вместо более общего urllib.

u= urlparse.urlparse(ep_url)
cn= httplib.HTTPConnection(u.netloc)
cn.request('GET', u.path, headers= {'User-Agent': ua})
r= cn.getresponse()

try:
    l= int(r.getheader('Content-Length', '0'))
except ValueError:
    l= 0
if l>maxlength:
    raise IAmCrossException()

thefile= r.read(maxlength+1)
if len(thefile)==maxlength+1:
    raise IAmStillCrossException()

Вы также можете проверить длину, прежде чем просить получить файл, если хотите. Это в основном то же самое, что и выше, за исключением использования метода 'HEAD' вместо 'GET'.

1 голос
/ 04 декабря 2011

Это будет работать, если установлен заголовок Content-Length

import urllib2          
req = urllib2.urlopen("http://example.com/file.zip")
total_size = int(req.info().getheader('Content-Length'))
1 голос
/ 28 октября 2009

вы можете сначала проверить длину содержимого в запросе HEAD, но имейте в виду, этот заголовок устанавливать не нужно - см. Как отправить HTTP-запрос HEAD в Python 2?

...