0

これがどのように可能かを理解しようとしています。

ユーザーがリンクをクリックできるようにして、特定のファイルをダウンロードできるようにします。ファイルは Ajax 呼び出しで決定されます (現在、ハードコードされた値しかありません)。

ただし、私の状況は次のとおりです。Ajaxが呼び出されると、リクエストに対して指定されたリンクは、フロントコントローラーを備えたフレームワークの一部であり、URLがリダイレクトされます。したがって、download.php のような名前のファイルへのリンクを送信して、そこにヘッダー コードだけを含めることはできません。フレームワーク プロセス全体を通過し、最終的に Ajax 呼び出しを処理するメソッドに到達します。

これが私のコードです:

$('.jobApplicationDownload').click(function() {
var that = $(this);
$
.ajax({
    type : "POST",
    url : "myfw/businessHome/applications/downloadJobApplicationItem",
    data : {
        "ajaxFileType" : that.attr("data-ftype"), "ajaxApplicationId" : that.attr("data-did")
    },
    success : function(html) {
        alert(html);
    },
    error : function(XMLHttpRequest,
            textStatus, errorThrown) {
        alert("ERROR");
    }
});

});

そして、ここにPHPがあります。これは、Front Controller と他の多くの方法を実行した後であることに注意してください。これは決して、Ajax 呼び出し後の最初の停止ではありません。

function downloadJobApplicationItem() {
    //download.php
    //content type
    $fileName = "/myfw/common/jobs/resumes/eZACKe_1359081853_Week Three Sprints & Hurdles Workout 24th - 28th of Sept (1).pdf";
    header('Content-disposition: attachment; filename='.$fileName);
    header('Content-type: application/pdf');
    //read from server and write to buffer
    readfile('/myfw/common/jobs/resumes/eZACKe_1359081853_Week Three Sprints & Hurdles Workout 24th - 28th of Sept (1).pdf');
    echo $_POST['ajaxFileType']. " ". $_POST['ajaxApplicationId'];
}

編集:ああ、ちなみに、この結果は、私がエコーしているアラートであり、ファイルのダウンロードは開始されていません。

4

2 に答える 2

2

すべての出力をバッファリングし、コントローラーがリダイレクトの場所を変更または設定解除できるようにすることで、この問題を解決しました。すべてのコントローラーが実行されたら、リダイレクトの場所を確認し、その時点で (必要な場合) リダイレクト ヘッダーを書き込みます。次に、バッファを出力します。

このようなもの:

$appSettings = new AppSettings();
$appSettings->setRedirect(...);
$controller=new Controller($appSettings);
ob_start();
$controller->run(); //Your controller can call $appSettings->setRedirect(false);
$redirect=$appSettings->getRedirect();
if($redirect===false)
{
    ob_end_flush(); //Send the buffer
}
else
{
    ob_end_clean(); //Discard the buffer
    header('Location: '.$redirect);
}
于 2013-01-25T03:41:00.723 に答える
2

あなたが複数の質問の間で混乱していると思うので、あなたの質問を読んで混乱しています。

  1. AJAX 要求は正しいハンドラーに到達しますか? : フレームワークで使用される URL ルーティング メカニズムと、その他のほとんどすべてがここでのみ重要であり、物理ファイルにアクセスできるかどうかには影響しません。それは全く別の問題です。とにかく、エコーが警告されるため、AJAX呼び出しは正しいと思います

  2. リダイレクトされる AJAX 呼び出しを介してファイルへのパスを送信する方法は? : 使用を検討できるトリックの 1 つは、あなたが行ったことと似ていますが、AJAX ハンドラーとして中央ダウンロード機能を持ち、AJAX で送信されたパラメーターを使用してファイルへのパスを構築することです。

  3. readfile が目的のファイルをバッファに出力しないのはなぜですか: パスが正しくないか、サーバー設定と互換性がない可能性が最も高いです。ここにサーバー構成を投稿していただけると助かります。

また、フレームワークの名前を投稿しても害はありません:)

于 2013-01-25T03:49:02.193 に答える