2011-01-13 125 views
0

我有一個接受一堆數據的textarea。然後,我通過$ .ajax將其提交給處理該腳本並生成KML的PHP​​腳本。強制通過jQuery下載文件

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(),但我無法強制它下載。

+1

你爲什麼要通過URL發送的所有數據到你的腳本,然後再? '進程'不能以某種方式保存數據? – 2011-01-13 17:43:56

回答

2

跟進的評論的討論,這樣做的最佳工作流程可能是

  1. 數據被通過Ajax和POST發送到mode=process;
  2. 腳本保存結果在一個臨時文件(隨機名稱),並返回Ajax響應體
  3. location.href呼叫轉到mode=download該文件和臨時文件的名稱
  4. 腳本打開臨時文件名,使其通過並刪除它
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.'); 
     } 

上。點擊功能使用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); 
});