强制文件通过JQuery下载

时间:2011-01-13 17:39:54

标签: jquery

我有一个接受大量数据的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(),但我不能强迫它下载。

2 个答案:

答案 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

上使用jquery
var 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)

在评论中进行讨论后,最佳工作流程可能是

  1. 数据通过Ajax和mode=process发送到POST;
  2. 脚本将结果保存在临时文件中(使用随机名称)并在AJAX响应正文中返回该文件的名称
  3. location.href调用转到mode=download和临时文件的名称
  4. 脚本打开临时文件,传递并删除它