PHP GeoServer 代理 Shape/Zip 请求 Returns 文本

PHP GeoServer Proxy Shape/Zip Request Returns Text

问题

我们的 GeoServer 访问由处理 authorization/authentication 的 PHP 脚本代理。这适用于 OpenLayers 地图中的 WMS/WFS 请求,但在尝试以相同方式下载 zipped-up shapefile 时效果不佳:响应总是 returns 请求作为文本。

我知道我的 URL 是正确的,因为当我使用准备好的 GeoServer URL 并手动输入凭据时,我得到了所需的“另存为”弹出窗口:

当 运行 通过代理时,我没有得到任何对话框和一堆垃圾:

解决方案尝试

我发现的大多数建议指向:

代码

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;

直接设置Headers

我可以让“保存”对话框以这种方式出现,但它始终是一个空的 zip。

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

cURL

这里没什么好评论的,因为我一直把它作为最后的手段。

现在怎么办?

考虑到 GS 完成了创建 zipped-up shapefile 的 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);