代码之家  ›  专栏  ›  技术社区  ›  alanquillin

修复在php中将文件从Linux下载到Windows时的文件结束编码

  •  0
  • alanquillin  · 技术社区  · 15 年前

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$destFileName);
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($fullPath));
    ob_clean();
    flush();
    readfile($fullPath);
    

    这一切都很好,文件可以下载。但有一个问题。这些文件正在从Linux机箱下载到Windows计算机(始终)。问题在于编码。在Linux框中查看文件时,所有文本都对齐,所有列看起来都很好。(这些文件只是简单的文本文件)。但是当文件被下载到Windows框中,并在记事本中打开时,文件就被弄脏了,并且没有对齐任何内容。您还可以看到奇怪的角色(看起来像盒子的角色,但这只是未知角色的一般表示)。当这个文件被导入到另一个程序中时,它不工作。

    我对文件编码没有太多的知识,所以在发送给用户下载之前,关于如何对文件进行编码的任何信息都将非常有用。

    readfile($fullPath); 与:

    $handle = @fopen($fullPath, "r");
    if ($handle) {
        while (!feof($handle)) {
            $buffer = fgets($handle);
            $buffer = str_replace('\n', '\r\n', $buffer);
            echo $buffer;
        }
        fclose($handle);
    }
    

    谢谢

    3 回复  |  直到 7 年前
        1
  •  2
  •   Frank Farmer    15 年前

    以下行有一个问题:

    $buffer = str_replace('\n', '\r\n', $buffer);
    

    你需要用双引号。“\n”是换行符。“\n'是文字字符序列反斜杠-n:

    # php -r "var_dump('\n', \"\n\");"
    string(2) "\n"
    string(1) "
    "
    
        2
  •  1
  •   Sean Cavanagh    15 年前

    有一个Unix实用程序“unix2dos”和“dos2unix”可能会有所帮助。您可以从php将其作为系统调用调用调用。

    或者,我肯定有一个php版本的相同的东西。

    但我不是一个php的家伙。

        3
  •  -1
  •   Christopher    15 年前

    编辑:我不知道PHP引用。尽管如此,当使用多种语言时,您可能需要确定标准编码,本文的其余部分仍然有效。

    用UTF8编码,然后告诉记事本将文件作为UTF8文档读入,这可能是最简单的方法。(它是“文件->打开”对话框中的下拉列表。)

    我看不到从命令行指定编码的方法,我也不确定记事本会自动找到它。