Скачать определенную часть большого файла zip - PullRequest
0 голосов
/ 10 декабря 2018

Я храню несколько больших zip-файлов на AWS Glacier и хотел бы узнать, возможно ли загрузить определенный файл или файлы из zip-файла без загрузки всего zip-файла?

Например, если бы я знал, что диапазон байтов с 92492 по 151231 соответствует определенному файлу (при условии, что это даже возможно ...), если я загружаю только эту часть zip-файла, у меня есть способ извлечь его?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Центральный каталог zip-файла хранится в самом конце файла.Самая последняя запись в ней, Конец записи центрального каталога , дает смещение, где этот каталог начинается.

Таким образом, вы можете прочитать весь центральный каталог и найти в нем нужную запись имени файла.В этой записи указывается, где начинается локальный заголовок файла для этого файла, и его (сжатый) размер.Чтение этого заголовка скажет, где файл начинается.За файлом может следовать дескриптор данных .Это обеспечивает всю информацию, необходимую для извлечения только этого файла с его заголовком и дескриптором.

Хотя теперь у вас достаточно информации, чтобы разархивировать файл, большинству инструментов потребуется центральный каталог, соответствующий только этому файлу, который выпридется воссоздать.Страница man для zip на моем Fedora предполагает, что zip -FF может «исправить» архив, в котором отсутствует центральный каталог.

0 голосов
/ 10 декабря 2018

Это зависит от сервера, но вы можете передать в запрос параметр byte-range .Если сервер примет это, вам доставят запрошенные вами данные.

Но я предполагаю, что вы не сможете извлечь данные.

import requests
url = 'http://i.imgur.com/z4d4kWk.jpg'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
    'Range': 'bytes=1000-1023'
}

response = requests.get(url, headers=headers)
print(response.headers['Content-Range'])

Возвращает:

bytes 1000-1023/146515
...