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 并手动输入凭据时,我得到了所需的“另存为”弹出窗口:
当 运行 通过代理时,我没有得到任何对话框和一堆垃圾:
解决方案尝试
我发现的大多数建议指向:
stream_context_create
- 在 header
中设置 Content-Disposition
readfile
代码
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);
问题
我们的 GeoServer 访问由处理 authorization/authentication 的 PHP 脚本代理。这适用于 OpenLayers 地图中的 WMS/WFS 请求,但在尝试以相同方式下载 zipped-up shapefile 时效果不佳:响应总是 returns 请求作为文本。
我知道我的 URL 是正确的,因为当我使用准备好的 GeoServer URL 并手动输入凭据时,我得到了所需的“另存为”弹出窗口:
当 运行 通过代理时,我没有得到任何对话框和一堆垃圾:
解决方案尝试
我发现的大多数建议指向:
stream_context_create
- 在 header 中设置
readfile
Content-Disposition
代码
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);