2015-03-30 1 views
1
import urllib.request,io 
url = 'http://www.image.com/image.jpg' 

path = io.BytesIO(urllib.request.urlopen(url).read()) 

Я хотел бы, чтобы проверить размер файла URL изображения в FileStream path перед сохранением, как я могу это сделать?Как получить размер файла изображения в питон при извлечении из URL (прежде чем сохранить)

Кроме того, я не хотят полагаться на Content-Length заголовки, я хотел бы, чтобы принести его в FileStream, проверьте размер и затем сохранить

+1

Возможный дубликат: http://stackoverflow.com/questions/5909/get-size-of-a-file-before-downloading-in-python –

+0

Почему не нужно полагаться на заголовки Content-Length? Вы можете проверить размер объекта BytesIO так же, как вы можете, с любым открытым файловым объектом, используя поиск до конца и 'fobj.tell()'. Но если вы используете заголовки Content-Length, вы можете * предотвратить необходимость сначала прочитать все изображение в памяти *. –

ответ

0

Вы можете запросить сервер для содержания - информация о длительности. Использование urllib2 (я надеюсь, что в вашем распоряжении есть питон):

req = urllib2.urlopen(url) 
meta = req,info() 
length_text = meta.getparam("Content-Length") 
try: 
     length = int(length_text) 
except: 
     # length unknown, you may need to read 
     length = -1 
1

Попробуйте импортировать urllib.request

import urllib.request, io 
url = 'http://www.elsecarrailway.co.uk/images/Events/TeddyBear-3.jpg' 
path = urllib.request.urlopen(url) 
meta = path.info() 

>>>meta.get(name="Content-Length") 
'269898' # ie 269kb 
+0

oh я обновлю – itzMEonTV

+0

с использованием 'urllib.request' – itzMEonTV

+0

Но теперь ваш ответ функционально ничем не отличается от llogiq и идет прямо против того, что просит ОП. –

1

Вы можете получить размер io.BytesIO() объекта таким же образом, вы можете получить его для любого файлового объекта : стремясь до конца и просить позиции файла:

path = io.BytesIO(urllib.request.urlopen(url).read()) 
path.seek(0, 2) # 0 bytes from the end 
size = path.tell() 

Однако, вы могли бы так же легко, как раз принято len() из байтовой строки вы только что прочитали, прежде чем вставить его в объект файла в памяти:

data = urllib.request.urlopen(url).read() 
size = len(data) 
path = io.BytesIO(data) 

Обратите внимание, что это означает, что изображение имеет уже загружен в память. Вы не можете использовать это, чтобы предотвратить загрузку слишком большого объекта изображения. Для этого используется единственный заголовок Content-Length.

Если сервер использует кодированное кодирование передачи для облегчения потоковой передачи (поэтому длина контента не была настроена спереди), вы можете использовать ограничение цикла, сколько данных считывается.

Смежные вопросы