Python HTTP-загрузка с использованием request.get всегда пропускает кусок - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь определить функцию, которая возобновляет загрузку, если соединение разорвано. Однако следующее не работает должным образом. В строке 8 мне нужно вручную определить размер одного блока, чтобы он работал, иначе в конечном файле будет отсутствовать ровно один размер блока каждый раз, когда я его возобновляю.

if os.path.exists(fileName):
    header = requests.head(url)
    fileLength = int(header.headers['Content-Length'])
    if fileLength == os.path.getsize(fileName):
        return True
    else:
        with open(fileName, 'ab') as f:
            position = f.tell()-1024
            pos_header = {}
            print(position)
            pos_header['Range'] = f'bytes={position}-'

        with requests.get(url, headers = pos_header, stream = True) as r:
            with open(fileName, 'ab') as f:
                    #some validation should be here

                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(r.content)
                        f.flush()
                        print(os.path.getsize(fileName))

else:
    with requests.get(url, allow_redirects=True, stream = True) as r:
        with open(fileName, 'wb') as f:
            iter = 0
            for chunk in r.iter_content(chunk_size = 1024):
                if chunk:
                    f.write(chunk)
                    f.flush()
                    iter += 1
                if iter > 2000:
                    break

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

1 Ответ

0 голосов
/ 27 мая 2020

У вас есть ошибка в коде, который загружает «остальную часть» файла, если это вторая попытка. Ошибка находится в следующей строке:

f.write(r.content)

Это должно быть

f.write(chunk)

По сути, вы повторяете фрагменты, но записываете весь контент, и это все портит.

...