我有一个接受大量数据的textarea。然后我通过$ .ajax将它提交给PHP脚本,该脚本处理它并生成KML。
var pData = $("textarea#data").serialize();
$.ajax(
{
type: "POST",
url: "tools.php?mode=process",
data: pData,
success: function(data)
{
window.location.href = "tools.php?mode=download&"+pData;
});
});
这确实很好,直到我开始获得越来越多的数据。现在我收到一个URI太大的错误,并试图找到一个强制文件下载的替代方法。我也试过使用$ .post(),但我不能强迫它下载。
答案 0 :(得分:3)
我发现将数据保存到文件然后强制下载jQuery,创建文件并使用PHP保存数据的最佳方法:
$data = ''; // data passed to a function or via $_POST['data']
$targetFolder = $_SERVER['DOCUMENT_ROOT'] . '/location/of/file/';
$savedFile = $targetFolder . md5($data). '.html';
$handle = fopen($savedFile, 'w') or die('Cannot open file: '.$savedFile);
fwrite($handle, $data);
if(file_exists($savedFile)) {
$fileName = basename($savedFile);
$fileSize = filesize($savedFile);
// Output headers.
header("Cache-Control: private");
header("Content-Type: application/stream");
header("Content-Length: ".$fileSize);
header("Content-Disposition: attachment; filename=".$fileName);
// Output file.
readfile ($savedFile);
exit();
}
else {
die('The provided file path: ' . $savedFile .' is not valid.');
}
在.click函数或$ .post
上使用jqueryvar forceDownload_URL = 'your/download/function/url.php';
$('#download').click(function(){
window.open(forceDownload_URL);
});
// Post method untested, but writing on the fly when called as above works well
// getting your forceDownload php to return the absolute path to your file
$.post(forceDownload_URL,{postdata:my_data},function(data){
window.open(data);
});
答案 1 :(得分:2)
在评论中进行讨论后,最佳工作流程可能是
mode=process
发送到POST
; location.href
调用转到mode=download
和临时文件的名称