1

「viewDoc」と呼ばれる機能があります。これは、Web ルートの外側のフォルダーに移動して、ファイルをフェッチすることになっています。画像(Jpgなど)では問題なく動作しますが、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は、テキストではなくファイル名のパラメータとともに使用されます。

動作する 2 つの例 (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);これにより他のディレクトリへのすべての参照が削除されるので使用できます (ただし、スラッシュを使用すると、サブディレクトリへのアクセスも削除されるため、コードとファイル構造に応じてスキップすることをお勧めします) )。

于 2012-08-07T10:32:32.130 に答える
0

ここにはセキュリティ上の大きな問題があります。作成した関数を使用して、誰でもサーバー上のあらゆるものにアクセスできます。これを使用せず、ファイル (アクセス可能であるべき) を公開 Web ディレクトリに置くことを強くお勧めします。

于 2012-08-07T10:32:54.953 に答える