2012-01-20 16 views
0

ファイルを強制的にダウンロードするPHPファイルを作成しました。 私はajax経由でそれを呼び出すと動作しません。Googleはajaxがダウンロードを処理できないと言います。 私はURLに向ける新しいウィンドウを開いてください。ajax経由で一時ダウンロードURLを取得

問題は、ファイルがPHPスクリプトの実行中にのみ存在することです。 どうすればこの問題を回避できますか?ここで

はコードです:

PHP:

<?php 
    $jsonStr = $_POST['jsonStr']; 

    $tmp_file = tempnam('/tmp', 'data-'); 
    $handle = fopen($tmp_file, 'a+'); 
    fwrite($handle, $jsonStr); 

    if(!$tmp_file) 
    { 
     // File doesn't exist, output error 
     die('file not found'); 
    } 
    else 
    { 
     // Set headers 
     header("Cache-Control: public"); 
     header("Content-Description: File Transfer"); 
     header("Content-Disposition: attachment; filename=iwbtg.lvl"); 
     header("Content-Type: text/plain"); 
     header("Content-Transfer-Encoding: binary"); 

     // Read the file from disk 
     readfile($tmp_file); 
    } 
?> 

JS:

... 

var jsonStr = JSON.stringify(jsonObj); 

// Request Level file 
var http = createRequestObject(); 
http.open("POST", "save.php", false); 
http.setRequestHeader("Content-Type", "application/x-www.form-urlencoded"); 
http.send("jsonStr=" + jsonStr); 


document.location = "tmp/iwbtg.lvl"; 
+2

この場合、ajaxは使用しないでください。必要な場合は、ajaxサーバー側のスクリプトに実際のダウンロードを行うURLを送り返し、クライアント側のスクリプトにそのURLの新しいウィンドウを開きます。 –

答えて

1

代わりのアヤックスあなたがiframeを使用することができます。これはかなりではありませんが、うまくいきます。あなたはiframeへの投稿を行い、それは最初の場所で回避しようとしていると思われるページ全体を再読み込みしません。 (アクションは時間がかかるため)あなたはUIをロックしたり、新しいウィンドウを開きたくない場合は、あなたが非表示のiframeでそれを行うことができます

+0

ええ、どうすればPHPファイルを開き、同時にPOST値を渡すことができますか? –

+0

あなたの最善の策は、iframeに投稿するようにフォームを設定することです。このリンクをチェックしてください:http://css-tricks.com/snippets/html/post-data-to-an-iframe/ – amosrivera

+0

ああ、ありがとう、それは働いた。 –

0

var downloadAsync = function(url, callback) { 
    var f = document.createElement('iframe'); 
    f.style.display = 'none'; 
    f.src = url; 
    f.onload = function() { 
     setTimeout(function() { 
      document.body.removeChild(f); 
     }, 500); 
     callback && callback(); 
    }; 
    document.body.appendChild(f); 
}; 

だけでサーバーが応答することを確認してくださいContent-Disposition: attachmentヘッダーを使用します。

関連する問題