【问题标题】:PHP fileread plain text filesPHP文件读取纯文本文件
【发布时间】:2010-09-10 13:22:15
【问题描述】:

我想在 PHP 中“强制”下载纯文本文件。

我有以下代码,我在网上某处找到的:

if (isset($_REQUEST["file"])) {
  $file=$_REQUEST["file"];
  header("Content-type: application/force-download");
  header("Content-Transfer-Encoding: ansi");
  header("Content-length: ".filesize($file));
  header("Content-disposition: attachment; filename=".basename($file));
  echo @fileread("$file");
}
else
{
  echo "No file selected";
}

这似乎工作正常,但是当使用记事本在 Windows 中打开文件时,不会保留行尾。谁能提供一个解决方案(文本文件必须用记事本创建)?

谢谢,里奇

【问题讨论】:

  • Windows 的notepad 很糟糕。使用其他任何东西,例如WordpadNotepad 总是有这个问题。
  • 如果您在记事本中查看文件而不先通过 PHP 脚本下载文件,文件是否显示正常?
  • 抱歉代码 - 它应该读取二进制而不是 ansi,我只是在搞乱并复制代码而没有改回来。与 readfile() 的拼写错误相同。
  • 文件在记事本中创建;因此在记事本中工作正常。它在 Save as... 对话框中使用 ANSI 编码。我无法控制我的用户阅读文件时使用的文本编辑器——他们中的大多数人不知道什么是 wordpad/textpad 等。

标签: php text file-io


【解决方案1】:

据我所知,记事本在这种情况下会删除这些行尾。

【讨论】:

    【解决方案2】:

    readfile(),不是文件读取。是的,这不是读取文件、PHP 甚至网络服务器问题。这只是unix和windows纯文本格式的区别。

    在 unix 中是 \n 而在 Windows 中是 \r\n
    您必须使用 windows 格式创建这些文件

    还请注意,您的代码非常不安全。并让攻击者读取您拥有的任何文件,包括密码等。 至少能做到

    $file=basename($_REQUEST["file"]);
    

    【讨论】:

    • 公平点,但我们不知道原始文件是否具有 unix 或 Windows 格式
    • 感谢您的关注。我只发布了一个sn-p;当脚本按我需要的方式工作时,我会担心安全性。
    【解决方案3】:

    据我所知,ansi 不是有效的内容传输编码。由于您想按原样保留文件的内容(并且这些内容可能包含长行和 CRLF 行结尾),您可能需要使用 binary

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2011-10-09
      • 2016-07-04
      相关资源
      最近更新 更多