在使用GitHub的API下载存储库zip文件时(在某个提交阶段),我注意到了这种奇怪的行为。
我有2个download
方法-
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 -> 在此处提取
现在,此文件的名称就是通过方法1 获得的名称(这很容易看到,因为如果打开zip,那就是其中包含的内容)。
这意味着,未压缩的文件以某种方式使用了没有版本标签部分的名称。
观察4
我上面列出的URI。。。有很多类似的内容。但是并非所有人都在Content-Disposition
中提供带有版本标记的文件名。在这种情况下,方法1 和方法2 基本上是等效的。
我如何理解这里到底发生了什么?这怎么可能?