0

在我正在构建的网站中,我试图为用户提供以 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);
            }
        } 

吉尔曼

4

0 回答 0