Вы можете получить размер 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
.
Если сервер использует кодированное кодирование передачи для облегчения потоковой передачи (поэтому длина контента не была настроена спереди), вы можете использовать ограничение цикла, сколько данных считывается.
Возможный дубликат: http://stackoverflow.com/questions/5909/get-size-of-a-file-before-downloading-in-python –
Почему не нужно полагаться на заголовки Content-Length? Вы можете проверить размер объекта BytesIO так же, как вы можете, с любым открытым файловым объектом, используя поиск до конца и 'fobj.tell()'. Но если вы используете заголовки Content-Length, вы можете * предотвратить необходимость сначала прочитать все изображение в памяти *. –