我正在为下载文件制作一个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');”在我的方法中没有运气。
这是我第一次看到这样的东西,这很奇怪,任何建议都会受到赞赏,谢谢!
答案 0 :(得分:0)
固定!!!
问题出在下一个:
在我的init.php文件中,我需要更多文件,其中一个文件(一个名为CONFIG.class.php的文件)具有UTF-8编码,我真的认为所有文件都是用ANSI进行的(是的,它们是除了这一个),然后我用Notepad ++将文件编码改为ANSI并瞧!它工作..
感谢大家的建议:)