6

PHPでCSVファイルを作成し、AJAX呼び出しからPHPファイルを呼び出します。これにより、AJAX呼び出しが成功するとCSVファイルのダウンロードが開始されます。これは、.csvの物理コピーをサーバーに保存する場合は正常に機能しますが、使用したいphp://ouputので、物理ファイルがサーバーを詰まらせる心配はありません。php://outputAJAXに戻ってからダウンロードを開始することは可能ですか?これが私のコードです:

HTML / jquery:

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <script type="text/javascript" language="javascript" src="jquery.js"></script>
        <script type="text/javascript">
             $("#download").live("click", function() {
                var request = $.ajax({
                    dataType: 'html',
                    url: 'php.php',
                    success: function(response) {
                        alert('Finished');
                    }
                })
            })
        </script>
    </head>
    <body>
        <h1 id="download">DOWNLOAD</h1>
    </body>
</html>

PHP:

<?php 
    header('Content-type: application/vnd.ms-excel');
    header('Content-disposition: attachment; filename="test.csv"');
    $f = fopen('php://output', 'w');
    fwrite($f,'this,is,a,test');
    fclose($f);
    readfile('php://output');
    return;
?>

これを取得して、AJAX呼び出しから[ファイルの保存]ダイアログを返す方法がわかりません。

これは単純なものでなければなりませんが、これら2つの問題を組み合わせた例は見つからないようです。

4

4 に答える 4

3

これを行うには、フォームを作成して jquery 経由で送信します (ページはリロードされません)。

$(document).on('click', '#download', function () {
    var form = $(document.createElement('form'));
    form.attr('action', 'php.php');
    form.attr('method', 'GET');
    form.appendTo(document.body);
    form.submit();
    form.remove();
});

また、必要に応じて投稿パラメーターを渡すこともできます。

$(document).on('click', '#download', function () {
    var form = $(document.createElement('form'));
    form.attr('action', 'php.php');
    form.attr('method', 'POST');
    var input = $('<input>').attr('type', 'hidden').attr('name', 'x').val('x value');
    form.append(input);
    form.appendTo(document.body);
    form.submit();
    form.remove();
});
于 2016-10-11T08:49:15.747 に答える
1

以下は機能しますが、php.php ファイルを 2 回呼び出すため、非常に非効率的です。誰かがより良いアイデアを持っていますか?

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <script type="text/javascript" language="javascript" src="jquery.js"></script>
        <script type="text/javascript">
             $("#download").live("click", function() {
                var request = $.ajax({
                    dataType: 'html',
                    url: 'php.php',
                    success: function(response) {
                        window.open('php.php');
                    }
                })
            })
        </script>
    </head>
    <body>
        <h1 id="download">DOWNLOAD</h1>
    </body>
</html>

とにかく、このインスタンスだけのために「php.php」をキャッシュして、すぐにロードされますが、次window.open('php.php')をクリックするとコンテンツがリロードされますdownloadか?

なぜwindow.open(response)同じように動作しないのですか?

于 2012-10-23T22:48:05.770 に答える
-2

ファイルのダウンロードを許可するには、以下のコードを呼び出すだけです (ボタンの onclick など)。

window.open(<file-url>);

お役に立てれば。

于 2013-04-02T04:49:45.347 に答える