Python Запрашивает модули: размещать очень большие файлы в блоках, чтобы отслеживать прогресс - PullRequest
1 голос
/ 21 апреля 2020

Я использую Python 3.8 на Windows 10, используя модуль requests. Как следует из заголовка, я отправляю очень большие файлы на HTTP-сервер и хочу указать статус загрузки.

Я прочитал 10-20 потоков переполнения стека в этой топи c, прочитал статьи были разбросаны по inte rnet и погружены в исходный код проектов на GitHub, который я даже сейчас не могу вспомнить. Я пытался реализовать все, что я прочитал, но безрезультатно. Большинству информации, касающейся этой топи c, уже много лет, и с тех пор модуль requests значительно улучшился - поэтому некоторая информация может быть устаревшей.

Проблема, с которой я сталкиваюсь - это отправка файла куски используя requests.Response.post('Some-URL', data=file_chunk, header=header). Если загружено 5 файловых блоков, то на сервере 5 отдельных файлов вместо 1 объединенного файла.

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

def read_in_chunks(file_object, chunk_size=1024):
    """Generator to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data

Затем я перебрал объект генератора, который был создан следующим образом:

with open('Some-File.zip', 'rb') as file_obj:
    for file_chunk in read_in_chunks(file_obj):
        requests.Response.post('Some-URL', data=file_chunk.encode('utf-8'), header=header)

Это НЕ работает. На сервере, на который загружаются чанки файлов, каждый чанк хранится на сервере в виде отдельного файла. Если файл разбит на 5 частей, то теперь есть 5 файлов. В документации requests говорится, что вы можете передать функцию генератора параметру data=, хотя я не могу заставить это работать. В документах также говорится, что для перебора данных используется Response.iter_content(), но я не знаю, что именно это означает или как это реализовать. Документация кажется немного скудной по этой теме c.

Я также пытался использовать requests-toolbelt, следуя этому коду здесь . Код в значительной степени идентичен примерам в документации. Я испытал ту же проблему, описанную выше. Я также создаю файл SHA-256 ha sh перед загрузкой, и ha sh будет меняться каждый раз, когда я выполняю сценарий до начала загрузки ... понятия не имею, поэтому я перестал использовать этот метод.

Существует вероятность того, что на стороне сервера загрузка файлов чанка не поддерживается, что является моей мыслью, если я реализую это правильно.

...