PHP GeoServer代理形状/ Zip请求返回文本

时间:2016-08-12 20:57:28

标签: php proxy http-headers geoserver

问题

我们的GeoServer访问由处理授权/身份验证的PHP脚本代理。这适用于OpenLayers映射中的WMS / WFS请求,但在尝试以相同方式下载压缩的shapefile时没有那么多:响应总是以文本形式返回请求。

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

FF Save Dialog

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

enter image description here

解决方案尝试

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

守则

网址准备

不确定是否重要,但这里是我准备发送到GS的URL(并且该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在创建压缩的shapefile方面做了99%的工作,这应该不是那么困难,但我已经没有东西可以尝试了。任何建议,将不胜感激!

1 个答案:

答案 0 :(得分:1)

听起来像这样有效:

$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);