我有一个名为“viewDoc”的函数,它应该转到web根目录之外的文件夹并为我取一个文件。它接缝可以正常使用图像(Jpgs等)但是使用PDF只会输出一个空白的灰色页面,如此处所示 - http://www.tutorplanner.com/userimage/viewdoc/12787622467.pdf
任何人都可以看到我做错了什么,因为我一直在摸不着头脑这一天!
public function viewDoc($doc) {
$path_parts = pathinfo($_SERVER['REQUEST_URI']);
$file = $doc;
$fileDir = '/var/uploads/';
if (file_exists($fileDir . $file))
{
$contents = file_get_contents($fileDir . $file);
//print_r($contents);
header('Content-Type: ' . mime_content_type($fileDir . $file));
header('Content-Length: ' . filesize($fileDir . $file));
readfile($contents);
}
}
答案 0 :(得分:4)
readfile与文件名参数一起使用 - 非文本。
两个可行的示例(file_get_contents):
public function viewDoc($doc) {
$path_parts = pathinfo($_SERVER['REQUEST_URI']);
$file = $doc;
$fileDir = '/var/uploads/';
$filePath = $fileDir . $file;
if (file_exists($filePath))
{
$contents = file_get_contents($filePath);
header('Content-Type: ' . mime_content_type($filePath));
header('Content-Length: ' . filesize($filePath));
echo $contents;
}
}
或(readfile):
public function viewDoc($doc) {
$path_parts = pathinfo($_SERVER['REQUEST_URI']);
$file = $doc;
$fileDir = '/var/uploads/';
$filePath = $fileDir . $file;
if (file_exists($filePath))
{
header('Content-Type: ' . mime_content_type($filePath));
header('Content-Length: ' . filesize($filePath));
readfile($filePath);
}
}
我还为你添加了$filePath
变量,因为没有理由连续多次连接字符串。
修改强>
作为额外的安全性,对于Yazmat的评论,你可以使用$file = str_replace(array('..', '/'), '', $doc);
,因为这会删除对其他目录的所有引用(但是,使用斜杠它也会删除对子目录的访问,所以你可能想跳过它,取决于您的代码和文件结构)。
答案 1 :(得分:0)
这里有一个很好的安全问题,任何人都可以使用您编写的功能访问服务器上的任何内容。我真的建议你不要使用它,只需将你的文件(应该是可访问的)放在公共网页目录上。