2

私はPHPを使用してクライアントコンピューターにダウンロードを強制しようとしています(ファイルダイアログで-不吉なことは何もありません)。PHPスクリプトからの応答を制御するためにheader()関数を使用することを推奨するページをたくさん見つけましたが、これではうまくいきません。私が持っているコードは次のとおりです。

$file = $_POST['fname'];

if(!($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file)) {
    die('File not found.');
} else {
    header('Pragma: public');
    header('Content-disposition: attachment; filename="tasks.zip"');
    header('Content-type: application/force-download');
    header('Content-Length: ' . filesize($file));
    header('Content-Description: File Transfer');
    header('Content-Transfer-Encoding: binary');
    header('Connection: close');
    ob_end_clean();
    readfile($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file);
}

私はこのJavaScriptを使用してそれを呼んでいます:

        $.ajax({
            url: url,
            success: function(text) {
                var req = new XMLHttpRequest();
                req.open("POST", 'php/utils/getXMLfile.php', true);
                req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                req.send('fname=' + encodeURIComponent(text));
            }
        });

これにより、ファイルの内容がテキストとして返されますが、ダウンロードダイアログはトリガーされません。誰か提案はありますか?

4

4 に答える 4

6

AJAX を使用する代わりに、ブラウザーを関連する URL にリダイレクトするだけです。content-disposition:attachmentヘッダーを受信すると、ファイルをダウンロードします。

于 2012-08-06T21:51:34.830 に答える
1

いくつかの提案:

1.

if(!($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file)) {

その代わり:

if(!file_exists($baseDir ....)){

2.サイズは必要ありません。

3.これを試してください:

 header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($fullpath));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    ob_clean();
    flush();
    readfile($fullpath);
    exit;
于 2012-08-06T21:53:20.163 に答える
0

ヘッダーを置き換えるために、次のように PHP からヘッダーを送信してみますapplication/force-download

header("Content-type: application/octet-stream");
于 2012-08-06T21:53:59.680 に答える
0

Kolinkの答えはうまくいきました(ウィンドウの場所をphpファイルに変更します)が、リクエストとともにPOST変数を送信したいので、代わりに非表示のフォームを使用することになりました。私が使用しているコードは次のとおりです。

                var url = 'php/utils/getXMLfile.php';
                var form = $('<form action="' + url + '" method="post" style="display: none;">' +
                    '<input type="text" name="fname" value="' + text + '" />' +
                    '</form>');
                $('body').append(form);
                $(form).submit();

すべての答えをありがとう!

于 2012-08-07T14:08:02.683 に答える