我正在为下载文件制作一个 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 文件时出现问题,似乎有双字符集或其他东西和文件结束搞砸了。我注意到函数 file_get_contents 返回了正确的字符串内容,因为我尝试使用 fopen 和 fwrite 函数将字符串保存到一个新文件中,该文件被复制了正确的字符。
在我看来,将产生输出的主脚本的字符集有问题,我尝试通过设置“header('Content-Type: application/octet-stream; charset=UTF-8');” 在我的方法中没有运气。
第一次看到这样的东西,很奇怪,大家多多指教,谢谢!