2016-07-06 2 views
0

Webルート上のフォルダからファイルをダウンロードします。のは、私は、このファイルを取得したいとしましょう:PHPは相対パスのない/ varフォルダからファイルをダウンロードします

/var/pdfs/test.pdf 

私のコードは次のとおりです。

$name = "test.pdf"; 
$url = "/var/pdfs/" . $name; 
if (file_exists($url)) { 
    header("Content-Type: application/pdf"); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename='" . basename($url) . "'"); 
    readfile($url); 
} else { 
    echo "Not found: $url"; 
} 

問題は、私はいつもNot found: $urlエコーを得ることです。あまりに

[email protected]:/var/pdfs$ ls -la 
total 6484 
drwxr--r-- 2 thecrafter root   4096 Jul 7 00:19 . 
drwxr-xr-x 13 root  root   4096 Jul 7 00:16 .. 
-rw-r--r-- 1 thecrafter thecrafter 6629018 Jul 7 00:18 test.pdf 

とディレクトリ::

私のファイルには、権限を読み取った

[email protected]:/var$ ls -la | grep pdfs 
drwxr--r-- 2 thecrafter root 4096 Jul 7 00:19 pdfs 

は、私が何かを欠場か?問題はどこだ?

EDITは1

クシシュトフDuszczykは、私がpdfsディレクトリに実行権限を与える場合は、問題が解決されることを指摘しました。確かに私はそれを与えた755そしてそれは働いている。それがなぜ起こるのか?

+0

pdfsフォルダに読み取り権がありますか? –

+0

IMHO同じ問題がある、それをチェックしてください。 http://stackoverflow.com/a/17896538/6557808 – Sylogista

+0

@KrzysztofDuszczykはい、私は私の質問を編集しました。 – TheCrafter

答えて

1

問題はあなたfile_exists()はおそらく内のファイルを保護することを意図したセキュリティ対策によってブロックされているあなたは、ファイルが実際にディスク上に存在することがわかっている場合

、(このケースでは、私は他の人を助けるためにそれを残していません)承認されていないアクセスからの/var/pdfs/これはfile_exists上のドキュメントからです:

警告:この関数が原因 セーフモードの制限にアクセスできないファイルのためにFALSEを返します。ただし、これらのファイルは、 がsafe_mode_include_dirにある場合にはインクルードすることができます。

ソリューション(再びないこの場合は、しかし、同様の症状を助けることができる)

あなたはsafe_mode_include_dir設定にディレクトリを追加したいです。 、あなたのphp.iniの設定を検索してコメントを外し、およびディレクトリを追加します。

safe_mode_include_dir = /var/pdfs/ 

これはまだ動作しない場合は、あなたもあなたのPHPにディレクトリを追加する必要がありますパスを含め、いずれかphp.iniinclude_pathを設定することにより、 PHPはバージョン5.4safe mode設定を削除したので、あなたは、最近のPHPのインストールを持っている場合は、あなたの問題は別の場所で可能性があることを

$path = '/var/pdfs' 
set_include_path(get_include_path() . PATH_SEPARATOR . $path); 

注:、またはあなたのスクリプトの先頭に、以下の行を持ちます。

+0

私のPHPスクリプトの上に 'ini_set(" safe_mode_include_dir "、"/var/pdfs/");を追加しようとしました。私はうまくいきませんでしたので、私はあなたの2番目の解決策を試みましたが、どちらもうまくいかなかった – TheCrafter

+0

私はあなたが誤解したと思います。私は 'ini_set'を使ってsafe_mode_include_dirを変更することを提案しませんでした。私は 'php.ini'で直接変更を行うことを提案しました。 2番目の提案は最初のもの(代替ではない)に加えて、どちらの方法でも最初に 'php.ini'を変更する必要があります。 – BeetleJuice

+0

私は '/ etc/php5/apache2/php.ini'を開きましたが、' safe_mode_include_dir'オプションはありません。コメントしていない。私はちょうどそれを追加する必要がありますか? – TheCrafter

関連する問題