我们的GeoServer访问由处理授权/身份验证的PHP脚本代理。这适用于OpenLayers映射中的WMS / WFS请求,但在尝试以相同方式下载压缩的shapefile时没有那么多:响应总是以文本形式返回请求。
我知道我的网址是正确的,因为当我拿到准备好的GeoServer网址并手动输入凭据时,我会获得所需的“另存为”弹出窗口:
然而,当通过代理运行时,我没有得到任何对话框和一堆垃圾:
我发现的大多数建议都指向:
不确定是否重要,但这里是我准备发送到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%的工作,这应该不是那么困难,但我已经没有东西可以尝试了。任何建议,将不胜感激!
答案 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);