【问题标题】:force download with hidden form not working使用隐藏表单强制下载不起作用
【发布时间】:2012-12-08 23:19:02
【问题描述】:

我正在尝试强制下载带有名为“证明”的 javascript 字符串的文件。我创建了一个隐藏表单,该表单触发了 php 脚本中的操作。我不使用 window.location.href 的原因是因为变量 Proof 很长,get 方法无法处理它。

//点击按钮保存时

$("#save").click(function () {
    var Proof = $("#main").html();
    var url = '/download-to-file.php';
    //send request
    jQuery('<form action="'+ url +'" method="post">'+
    '<input type="hidden" name="Proof" value="'+ Proof +'" />'+
    '</form>').appendTo('body').submit().remove();

 });

php代码:

<?php
$Proof = $_POST["Proof"];
$proof = stripslashes($Proof);

$file = 'savedproof.txt';


file_put_contents($file, $proof);
header('Content-disposition: attachment; filename="'.$file.'"');
header("Content-Type: text/txt");
header("Content-Transfer-Encoding: binary");
header('Content-length: '.filesize($file));  
header('Accept-Ranges: bytes');
header('Content-Description: File Transfer');

readfile($file);
?>

我收到一个下载对话框,但文件是空的。我什至尝试使用像“test”这样的较小字符串,但仍然是空的,所以我猜测隐藏表单的值不起作用。

谢谢

【问题讨论】:

  • 您的日志文件中是否有任何错误?
  • 你确定你有改写文件的权限吗?此外.. $Proof 变量不为空吗?如果输出是您从表单中得到的,还需要覆盖文件吗?
  • 变量不为空,我用警报(证明)检查过,它包含 html 代码。对于写入权限,我尝试了下面的建议,但没有成功,甚至没有出现下载对话框。我只是想让用户将网站的主 div 下载为文本文件。这个主 div 是由用户动态生成的。如果他愿意,他以后可以加载它。
  • @pregmatch 每次点击后我都没有收到任何错误我只是得到 [06:18:45.971] POST proof-editor.host-ed.me/download-to-file.php [HTTP/1.1 200 OK 832ms]

标签: php javascript download hidden-field


【解决方案1】:

我想知道file_put_contents 是否失败,但技术上没有必要将数据写入文件,因为它已经在 $_POST 中。

试着把代码改成这个,看看是否有效:

<?php
$Proof = stripslashes($_POST["Proof"])

header('Content-disposition: attachment; filename="savedproof.txt"');
header("Content-Type: text/html; charset=utf-8");
header('Content-length: '.strlen($Proof));  
header('Accept-Ranges: bytes');
header('Content-Description: File Transfer');

echo $Proof;

【讨论】:

  • 我尝试了您的代码,它只是将我重定向到 .../download-to-file.php 并带有一个空白页面,并且出现控制台错误:“HTML 文档的字符编码是未声明。如果文档包含 US-ASCII 范围之外的字符,则在某些浏览器配置中文档将呈现乱码。页面的字符编码必须在文档或传输协议中声明。@ .... /download-to-file.php"
  • 我删除了您拥有的 content-transfer-encoding 标头,看看是否有帮助。证明是 HTML 还是纯文本?如果是 html,您可以尝试 Content-Type: text/html; charset=UTF-8 作为 content-type 标头。
  • 谢谢,当我添加额外的标题和内容类型时,它起作用了。但是,引用存在一些问题,但这是我要解决的,至少文件中有一些内容。再次感谢。
  • 没问题。也许不需要stripslashes?或者只是HTML实体&amp;quot;需要翻译成"?如果是这种情况,那么html_entity_decode 应该是有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2011-06-16
  • 1970-01-01
  • 2022-01-04
  • 2018-11-17
  • 1970-01-01
  • 2011-09-05
相关资源
最近更新 更多