PHP - 输出错误字符的文件内容

时间:2013-10-18 17:13:52

标签: php file character-encoding download

我正在为下载文件制作一个php脚本,这是一个奇怪的问题。

结果是我有一个A类,它包含下载文件的方法,然后我要求使用'require_once'的文件到一个名为init.php的文件中,init.php是必需的生成类实例的主脚本和用户必须访问的实例。 init.php是启动我的系统并加载它的配置的那个。

好的,类工作正常,但是当文件为文件目标内容输出时问题就出现了。

这是我班级的方法:

public function descargar ($nombreDescarga = null) 
{
    if ($this->id === null || $this->formato === null || $nombreDescarga === null || 
        gettype($nombreDescarga) != "string" || strlen($nombreDescarga) == 0) 
    {
        return 1;
    }

    $ruta = RUTA_SISTEMA . "/" . RUTA_ASIGNACIONES . "/asign-" . $this->id . "." . $this->formato;
    $tamano = @filesize($ruta);

    /**
    * Comprobamos si el archivo existe.
    */

    if ($tamano === false) 
    {
        return 2;
    }

    /**
    * Saneamos el nombre de salida del archivo.
    */

    $nombreDescarga = Framework\sanearNombreArchivo($nombreDescarga . "." . $this->formato);

    /**
    * Colocamos los headers necesarios.
    */

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $nombreDescarga);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . $tamano);

    /**
    * Abrímos el archivo y lo enviamos al navegador.
    */

    $contenido = @file_get_contents($ruta);

    if ($contenido === false) 
    {
        return 3;
    }

    echo $contenido;

    return 0;
}

好的,这是下载文件,放置标题,然后输出文件内容的常用方法(其余是纯验证)但是当文件下载文件的内容而不是:

ÈFÃË‹Átí#ª6˜²"wÇ9Ê´ÀÄ:0t

结果是:

�F�ˋ�t�#�6��"w�9����:0t

我试过通过为下载制作一个单独的脚本,并且工作完美,文件下载了正确的字符,我只是想通了当我包含init.php文件时出现问题,似乎有双charset或其他东西和文件结束搞砸了。我注意到函数file_get_contents返回正确的字符串内容,因为我尝试将字符串保存到带有fopen和fwrite函数的新文件中,文件是用正确的字符复制的。

在我看来,主要脚本的字符集会产生输出问题,我尝试设置“header('Content-Type:application / octet-stream; charset = UTF-8');”在我的方法中没有运气。

这是我第一次看到这样的东西,这很奇怪,任何建议都会受到赞赏,谢谢!

1 个答案:

答案 0 :(得分:0)

固定!!!

问题出在下一个:

在我的init.php文件中,我需要更多文件,其中一个文件(一个名为CONFIG.class.php的文件)具有UTF-8编码,我真的认为所有文件都是用ANSI进行的(是的,它们是除了这一个),然后我用Notepad ++将文件编码改为ANSI并瞧!它工作..

感谢大家的建议:)