私が構築している Web サイトでは、KML 形式でデータをエクスポートおよびダウンロードする機能をユーザーに提供しようとしています。文字列から kml ファイルを生成する PHP スクリプトを作成しました。リクエストが長くなりすぎて 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;
}
* 編集 *
OK、GET の代わりに POST を使用するように php スクリプトを変更しました。これにより、長さの問題が解消されます。しかし、これは私に別の問題を示しました。
私は自分のウェブサイトを書くために道場を使用しています。POST メソッドで xhr リクエストを実行しています。このリクエストは正常に返されます。成功ハンドラーでは、非表示の iFrame の src を設定して (ページのリロードを避けるため)、リクエストに渡したのと同じ URL に移動しています。私のスクリプト (POST) では機能しない GET リクエストが発生します。
必要なパラメーターを指定して、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);
}
}
ギルマン