2011-01-13 28 views
0

私は、たくさんのデータを受け入れるテキストエリアを持っています。私は$ .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を通じて再びスクリプトにすべてのデータを送信し、されていますか? 'process'は何とかデータを保存しませんか? –

+1

正確に 'pData'で渡しているのはなぜですか?同じデータをPOSTとQST経由で渡すために2つの別々の呼び出しを使用するのはなぜですか?ダウンロードが開始されたときと同じ呼び出しで処理できるようです。 –

+0

@ペッカ私は本当にわかりません。私の脳は機能しません。しかし、あなたは良い点を提起し、これを解決する方法について私に確固たるアイデアを与えます。 @Quintinこれは、一連のランダムなデータビットの直列化された文字列です。 – Nathan

答えて

2

、このための最適なワークフローでは、データはAjaxとPOSTを通じてmode=processに送信されます

  1. かもしれません。
  2. スクリプトが(ランダムな名前の)一時ファイルに結果を保存し、
  3. スクリプトが一時ファイルを開く
  4. location.href呼び出しがmode=downloadに行くAJAXレスポンスボディにそのファイルや一時ファイルの名前の名前を返します。 、それを通過し、それを削除します
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機能上のjqueryのか、$ .post

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); 
}); 
関連する問題