Как скачать выписки ZIP из Росреестра с помощью PHP
Задача такая:
Скачать выписку из Росреестра (ZIP c ЭЦП) и сохранить на локальный диск. есть программа, которая позволяет по одному GET запросу получить выписку по номеру заявки фгис.
Проблема заключается в следующем:
если заказ готов, в ответ на запрос приходит заголовок Content-type: application/zip и контент самого зип файла.
а если заказ не готов или какая либо ошибка, то приходит Content-type: application/json и контентом является код ошибки.
Теперь вопрос:
как при получении ответа на запрос проверить заголовок content-type и только в случае application/zip сохранить контент в виде файла?
мой код выглядит так:
<?php
$content = file_get_contents("http://localhost:5533/мой-ключ-фгиса/80-107535221");
file_put_contents('/home/rosreestr-zip-files/80-107535221.zip', $content);
PS, программа о которой идет речь называется FgisDownloader. источник: https://github.com/harimahari/FgisDownloader
Ответы (2 шт):
Заголовки запроса можно получить, используя зарезервированную переменную $http_response_header. Далее вам потребуется извлечь оттуда нужные заголовок content-type и на его основе уже принимать решение, сохранять ответ или нет. Ориентироваться надо не на индексы в массиве (которые могут изменяться), а на поиск вхождения Content-type: в саму строку значения.
зы: скорее всего тип ответа вообще можно определить банально по длине. Если json имеет длину пару десятков-сотен байт, то zip там явно килобайты-мегабайты будет занимать. Но так, конечно, делать не надо.
Пример
$headers = get_headers('https://w3.org');
$contentType = getResponseHeader('content-type', $headers);
if ($contentType === 'application/zip') {
$filename = __DIR__ . '/my_zip.zip';
$fp = fopen($filename, 'w');
$ch = curl_init('https://codeload.github.com/laravel/laravel/zip/refs/heads/8.x');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Optional
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$zipArchive = new ZipArchive();
$zipArchive->open($filename);
$zipArchive->extractTo(__DIR__);
$zipArchive->close();
unlink($filename);
}
function getResponseHeader(string $header, array $response) : string
{
foreach ($response as $headerLine) {
if (stripos($headerLine, $header . ':') === 0) {
return trim(explode(':', $headerLine, 2)[1]);
}
}
return '';
}