文件处理程序返回乱码文件

时间:2010-04-09 18:37:10

标签: php .htaccess file header

在过去的3个月里,我的网站一直在使用PHP文件处理程序和htaccess。 访问该站点的uploads文件夹的用户将被重定向到处理程序:

RewriteRule  ^(.+)\.*$ downloader.php?f=%{REQUEST_FILENAME} [L]

文件处理程序的目的是伪编码,然后是实际代码。

//Check if file exists and user is downloading from uploads directory; True.
//Check against a file type white list and set the mime type(); $ctype = mime type;
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

截至昨天,处理程序开始返回乱码文件,无法读取的图像,并且必须被绕过。我想知道什么设置可能导致错误导致这种情况。

- 编辑 -

发现问题,但未解决。包括我用于与Wordpress集成的php库的路径正在破坏文件。删除该代码块可以解决损坏问题,但无需所需的身份验证即可访问这些文件。

  @include_once($_SERVER['DOCUMENT_ROOT'].'/wp-blog-header.php');
  if(!is_user_logged_in()) 
  {
    auth_redirect(); //Kicks the user to a login page.
  }

  //resume download script

2 个答案:

答案 0 :(得分:1)

也许更多的测试会揭示问题...

if ( !isset($filename) ) {
  die('parameter "filename" not set');
}
else if ( !file_exists($filename) ) {
  die('file does not exist');
}
else if ( !is_readable($filename) ) {
  die('file not readable');
}
else if ( false===($size=filesize($filename)) ) {
  die('stat failed');
}
else if ( headers_sent() || ob_get_length()>0) {
    die('something already sent output.');
}
else {
  $basename = basename($filename);

  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Cache-Control: private",false); // required for certain browsers
  header("Content-Type: $ctype");
  header("Content-Disposition: attachment; filename=\"".$basename."\";" );
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: ".$size);
  readfile($filename);
}

答案 1 :(得分:0)

文件是如何损坏的?截断? 0字节?完全不同的内容?随机部分用垃圾代替?

服务器的PHP内存限制是否有可能降低? readfile()将在输出之前将整个文件缓冲在内存中。因此,40meg文件将失败是内存限制是39.9999,那种事情。

为了将文件流式传输给用户,最好不要使用php自己的“转储文件到浏览器”功能,因为它们都受内存限制。最好做一个fopen / fwrite / fclose循环并以小的可管理块(4k,16k等)吐出文件。