Я использую cURL для загрузки репозитория из GitLab, используя их API. Все это делается с помощью PHP. Код ниже:
$zipResource = fopen('archive.zip', 'w');
$ch = curl_init("http://example.com/api/v3/projects");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("PRIVATE-TOKEN: private_token_goes_here"));
curl_setopt($ch, CURLOPT_URL, "http://example.com/api/v3/projects/64/repository/archive");
curl_setopt($ch, CURLOPT_FILE, $zipResource);
curl_exec($ch);
curl_close($ch);
Краткий обзор: создайте пустой zip-файл. Подключитесь к серверу, получите архив и запишите его в zip-файл.
Архив появляется на сервере, я могу его скачать, и я могу разархивировать его, когда дважды щелкну по нему, все файлы есть, и все, кажется, в порядке.
Однако, когда я пытаюсь разархивировать его с помощью терминала, появляется следующая ошибка:
Archive: archive.ZIP
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
То, что я пробовал до сих пор, было:
Установка заголовков как "Content-type: application/zip"
, Установка заголовков как "Content-Transfer-Encoding: Binary"
(с типом файла архива в 'wb' //binary
) или же "Content-type: application/octet-stream"
и так далее. Конечный результат всегда был одним и тем же, то есть я получал ошибку, упомянутую выше, при попытке распаковать архив.
Я могу только предположить, что я либо неправильно использую cURL, либо неправильно настраиваю заголовки, либо что-то не так с их API (очень маловероятно).
Любое подталкивание в правильном направлении очень ценится.
Я столкнулся с той же проблемой с Gitlab. Скачать как tar в моем случае работает нормально. Я также обнаружил, что загруженный ZIP-файл фактически содержит все данные, но поврежден. Данные из ZIP-файла все еще можно восстановить, если установлена Java:
jar xvf corrupted-zip-file.zip
Других решений пока нет …