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);
?>

的JavaScript:

$("#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>

然后有一个onready函数来改变href基于的值#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 回答