1

我有一个名为“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);
        }


}
4

2 回答 2

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;
        }
}

或(读取文件):

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);它,因为这将删除对其他目录的所有引用(但是,使用斜杠它也会删除对子目录的访问,因此您可能希望跳过它,取决于您的代码和文件结构)。

于 2012-08-07T10:32:32.130 回答
0

您在这里有一个很大的安全问题,任何人都可以使用您编写的函数访问您服务器上的任何内容。我真的建议您不要使用它,只需将您的文件(应该可以访问)放在公共网络目录中。

于 2012-08-07T10:32:54.953 回答