在我正在构建的网站中,我试图为用户提供以 KML 格式导出和下载数据的能力。我已经构建了一个 PHP 脚本来从一个字符串生成一个 kml 文件。它工作得相当好,直到请求变得太长,然后我得到 414 错误。
问题是,我很确定我会走错路(我是 php 新手)。而不是将我的数据作为字符串发送,它可以达到数万个字符的长度,我应该将由 javascript 生成的文件发送到 php 脚本,该脚本会将其发送回用户或类似的东西。可能吗?
如果没有,我还有什么其他选择?
这是我的 php 脚本:
if($_SERVER['REQUEST_METHOD']=='POST') {
$text = $_POST['text'];
$text = str_replace('\r\n', PHP_EOL, $text);
$text = str_replace('\n', PHP_EOL, $text);
$text = str_replace('\t', "\t", $text);
$text = str_replace('_HASH_', "#", $text);
$filename = $_POST['filename'];
$tmpName = tempnam(sys_get_temp_dir(), $filename);
$file = fopen($tmpName, 'w');
fwrite($file, $text);
fclose($file);
header('Content-Description: File Transfer');
header("Content-Type: application/octet-stream");
//header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename=' . $filename . '.kml');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($tmpName));
ob_clean();
flush();
readfile($tmpName);
unlink($tmpName);
exit;
}
* 编辑 *
好的,我将 php 脚本更改为使用 POST 而不是 GET,这应该可以解决长度问题。但这向我展示了另一个问题。
我正在使用 dojo 来编写我的网站。我正在使用 POST 方法执行 xhr 请求。此请求成功返回。在成功处理程序中,我通过设置隐藏 iFrame 的 src 导航到传递给请求的相同 url(以避免重新加载页面)。结果导致 GET 请求不适用于我的脚本 (POST)。此外,我相信这意味着我正在运行 php 脚本两次,这没有任何意义。
我应该直接导航到带有所需参数的 php 脚本的 url 吗?在这种情况下,如何使用 POST 请求导航到 url?
我对这一切有点困惑,它可能也显示出来了!
谢谢,
* 解决方案 *
mguimard 让我在正确的轨道上解决我的问题。这是我用来发送 POST 请求同时避免重新加载页面的代码:
download: function(text) {
var ifr = document.createElement('iframe');
ifr.setAttribute('name', "target");
ifr.style.display = 'none';
document.body.appendChild(ifr);
var f = document.createElement('form');
f.setAttribute('method',"post");
f.setAttribute('action',"saveFileAs.php");
f.setAttribute('target',"target");
addField(f, "filename", "myFileName");
addField(f, "text", text);
f.submit();
ifr.onload = cleanUp;
function cleanUp(){
document.body.removeChild(ifr);
ifr = null;
}
function addField(form, name, value) {
var i = document.createElement("input");
i.setAttribute('name',name);
i.setAttribute('type','text');
i.value = value;
form.appendChild(i);
}
}
吉尔曼