PHP GeoServer Proxy Shape / Zip-запрос возвращает текст

Эта проблема

Наш доступ к GeoServer передается через скрипт PHP, который обрабатывает авторизацию / аутентификацию. Это прекрасно работает для запросов WMS / WFS в карте OpenLayers, но не так сильно при попытке загрузить сжатый шейп-файл тем же способом: ответ ВСЕГДА возвращает запрос в виде текста.

Я знаю, что мой URL-адрес правильный, потому что когда я беру предварительно настроенный URL-адрес GeoServer и ввожу учетные данные вручную, я получаю желаемое всплывающее окно «Сохранить как»:

FF Сохранить диалог

Однако при запуске через прокси у меня нет диалогов и куча мусора:

введите описание изображения здесь

Решение пытается

Большинство предложений, которые я нашел, указывают на:

Код

Подготовка URL

Не уверен, что это имеет значение, но вот как я готовлю URL для отправки в GS (и этот URL отлично работает без прокси, учетные данные вручную):

// Encode geoserver credentials
$auth = base64_encode('username:password');

// Base URL and parameters
$url = 'https://example.com/mygeoserverpath/wfs?';
$query = '';

// Extract arguments
$orig_proxy_url = $_SERVER['REQUEST_URI'];
$orig_query = parse_url($orig_proxy_url, PHP_URL_QUERY);
parse_str($orig_query, $orig_args);

// Loop over arguments, append to base url
foreach ($orig_args as $key => $value) {
if ($key === 'cql_filter') {
$value = rawurlencode($value);
}
$query = $query . '&' . $key . '=' . $value;
}

$url = $url . $query;

С помощью stream_context_create с другими вещами

$opts = array(
'http' => array (
'method' => "GET",
'header' => "Authorization: Basic $auth". "Content-Description: File Transfer\r\n". "Content-Type: application/zip\r\n". "Content-disposition: attachment; filename=testing.zip\r\n"));
$ctx = stream_context_create($opts);

…в сочетании с некоторыми другими попытками:

// file_get_contents returns text
$output = file_get_contents($url,false,$ctx);

// readfile returns text
readfile($url,false,$ctx);

// fopen/passthru returns text
$fp = fopen($url,'r',0,$ctx);
fpassthru($fp);
exit;

Установка заголовков напрямую

Я мог заставить диалоговое окно Сохранить появляться таким образом, но это всегда был пустой почтовый индекс.

header("Content-Description: File Transfer");
header("Content-Type: application/zip");
header("Content-disposition: attachment; filename=testing.zip");
header("Authorization: Basic $auth");

cURL

Здесь не так много комментариев, поскольку я сохранял это как последнее средство.

Что теперь?

Это не должно быть так сложно, учитывая, что GS выполняет 99% работы по созданию сжатого шейп-файла, но у меня заканчиваются вещи, которые можно попробовать. Мы ценим любые предложения!

0

Решение

Похоже, это сработало:

$opts = array(
'http' => array (
'method' => "GET",
'header' => "Authorization: Basic $auth"));

header("Content-Disposition: attachment; filename=testing.zip");
$ctx = stream_context_create($opts);
$fp = fopen($url,'r',0,$ctx);
fpassthru($fp);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]