Наш доступ к GeoServer передается через скрипт PHP, который обрабатывает авторизацию / аутентификацию. Это прекрасно работает для запросов WMS / WFS в карте OpenLayers, но не так сильно при попытке загрузить сжатый шейп-файл тем же способом: ответ ВСЕГДА возвращает запрос в виде текста.
Я знаю, что мой URL-адрес правильный, потому что когда я беру предварительно настроенный URL-адрес GeoServer и ввожу учетные данные вручную, я получаю желаемое всплывающее окно «Сохранить как»:
Однако при запуске через прокси у меня нет диалогов и куча мусора:
Большинство предложений, которые я нашел, указывают на:
stream_context_create
Content-Disposition
в шапкеreadfile
Не уверен, что это имеет значение, но вот как я готовлю 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% работы по созданию сжатого шейп-файла, но у меня заканчиваются вещи, которые можно попробовать. Мы ценим любые предложения!
Похоже, это сработало:
$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);
Других решений пока нет …