Я заметил это странное поведение при использовании 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 становятся по существу эквивалентными.
Как я понимаю, что именно здесь происходит? Как это вообще возможно?