在过去的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
答案 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等)吐出文件。