Почему «загруженный и извлеченный» zip-файл отличается от загруженного zip-файла двумя разными способами? - PullRequest
0 голосов
/ 09 ноября 2018

Я заметил это странное поведение при использовании API GitHub для загрузки zip-файлов репозитория (на определенной стадии фиксации). У меня есть 2 download методы -

  • Один загружает и извлекает ZIP-файл, а затем сохраняет его в диск.
  • Другой напрямую записывает содержимое в виде двоичного zip-файла. получение параметра filename из заголовка Content-Disposition

URI, который вы можете использовать для воспроизведения этой проблемы: this

Метод 1

def download(url_list, download_path):
    for url in url_list:
        r = requests.get(url)
        z = zipfile.ZipFile(io.BytesIO(r.content))
        z.extractall(download_path)

Метод 2

def download(url_list, download_path):
    for url in url_list:
        r = requests.get(url)
        filename = r.headers['Content-Disposition'].split('filename=')[1]
        full_path = os.path.join(download_path, filename)
        with open(full_path, 'wb') as f:
            f.write(r.content)

Вам нужно будет использовать этот импорт-

import os
import io
import zipfile
import requests

Наблюдение 1
С помощью Метод 1 файл сохраняется с именем daimajia-AndroidSwipeLayout-5f8678b
С помощью Метод 2 файл сохраняется с именем daimajia-AndroidSwipeLayout-v1.2.0-25-g5f8678b (на данный момент игнорируем часть файла zip )

Наблюдение 2
Часть имени файла, пропущенная в Метод 1 , кажется, соответствует тегу версии из GitHub.

Наблюдение 3
Я провел еще один эксперимент, чтобы понять, почему это происходит. Перейти к вашему файлу, загруженному с помощью Метод 2 и Щелкните правой кнопкой мыши -> Выбрать 7-Zip -> Извлечь здесь
Теперь имя этого файла - то, что вы получили бы с помощью Method 1 (что легко увидеть, потому что если вы откроете zip-файл, это то, что в нем содержится).
Что означает, что несжатый файл каким-то образом берет свое имя без части тега версии .... но как?

Наблюдение 4
URI, который я перечислил выше .... многим это нравится. Однако Не все дают вам имя файла внутри Content-Disposition с тегами версии. В таких случаях Метод 1 и Метод 2 становятся по существу эквивалентными.

Как я понимаю, что именно здесь происходит? Как это вообще возможно?

...