3

ボタンをクリックすると、txtファイルを強制的にダウンロードしようとしています。コンテンツは動的に生成され、javascript 変数に格納されます。ボタンをクリックしてもダウンロード ウィンドウは表示されませんが、ajax 呼び出しは成功します。私は何を間違っていますか?

php:

<?php
$Proof = $_REQUEST["Proof"];
$proof = stripslashes($Proof);
$file = 'savedproof.txt';
file_put_contents($file, $proof);
header('Content-disposition: attachment; filename="'.$file.'"');
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header('Content-Description: File Transfer');

readfile($file);
?>

ジャバスクリプト:

$("#save").click(function () {

    var proof = $("#main").html();
     $.ajax({ 
             type: 'POST', 
             url: 'save-to-file.php',
             data: {Proof: Proof},
             dataType: "html"

            });
}

別の方法として、window.location.href を使用してみましたが、変数 Proof を php ファイルに渡すことができませんでした。私はこのようなことを試しました:

window.location.href ="download.php?Proof="+Proof;

ダウンロード ダイアログは表示されますが、変数 Proof の最初の部分だけがファイルに含まれています。私はFirefoxとChromeで両方の方法をテストしました。

4

3 に答える 3

3

セキュリティ上の懸念から、Javascriptはクライアントマシンにファイルをダウンロードできません。

ボタンをリンク(任意のスタイル)にして、次のようにします。

<a id="save" href='/path/to/download.php' target="_blank"></a>

href次に、の値に基づいてを変更するonready関数を用意します。#main

$.ready(
   var proof = $('#main').html();
   var href = $('#save').attr('href') + '?Proof=' + encodeURIComponent(proof);
   $('#save').attr('href', $href); 
});

私の知る限り、ここではAJAXの理由はまったくありません。

于 2012-12-07T23:03:04.200 に答える
1

ブラウザ ナビゲーションをトリガーしていないため、AJAX リクエストが機能していません。それは、それを無視しているJavascriptへの応答を提供しているだけです。結果をダウンロードするには、おそらく偽の<form>要素を作成して送信する必要があります。

関係する限りwindow.location.href、URL は通常約 2 ~ 4 KB に制限されているため、途切れてしまいます。それではうまくいきません。

于 2012-12-08T02:26:38.337 に答える
0

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

$(document).on('click', '#save', function () {
    var proof = $("#main").html();
    var form = $(document.createElement('form'));
    form.attr('action', 'save-to-file.php');
    form.attr('method', 'POST');
    var input = $('<input>').attr('type', 'hidden').attr('name', 'Proof').val(proof);
    form.append(input);
    form.appendTo(document.body);
    form.submit();
    form.remove();
});
于 2016-10-11T09:41:25.780 に答える