为什么“下载和提取”的zip文件名不同于通过两种不同方法下载的zip文件?

时间:2018-11-09 11:38:35

标签: python github python-requests zip content-disposition

在使用GitHub的API下载存储库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 -> 在此处提取
现在,此文件的名称就是通过方法1 获得的名称(这很容易看到,因为如果打开zip,那就是其中包含的内容)。
这意味着,未压缩的文件以某种方式使用了没有版本标签部分的名称。

观察4
我上面列出的URI。。。有很多类似的内容。但是并非所有人都在Content-Disposition中提供带有版本标记的文件名。在这种情况下,方法1 方法2 基本上是等效的。

我如何理解这里到底发生了什么?这怎么可能?

0 个答案:

没有答案