0

Web サーバーでホストされている大量のドキュメントがあり、これらのファイルは機密であるため、直接 HTTP リクエストで取得したくないとします。ファイル名の暗号化を開始しましたが、さらに一歩進めたい場合は、それらのファイルを /public_html フォルダーの外に配置し、PHP に要求されたファイルを /public_html の外のフォルダーから取得させるのはどうでしょうか?

これをテストしようとしていますが、私の小さなスクリプトが間違ったファイル名の 0kb .pdf ファイルを取得しています:

<?php 

$file = '/home/clientaccount/secretfiles/file.pdf'; 
if(!file_exists($file)){
    die('Error: File not found.');
}
else
{
    // Set headers
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: application/pdf");
    header("Content-Transfer-Encoding: binary");
} ?>
4

3 に答える 3

2

変数 $file は単なる文字列です。訪問者に届くヘッダーは次のように伝えます。

Content-Disposition: 添付; filename=/home/clientaccount/secretfiles/file.pdf

これは、訪問者がアクセスできるフォルダーではありません。

于 2012-07-07T13:59:33.367 に答える
1

コードを適切に動作させるには、php にファイルを読み取らせて出力させるコマンドを追加する必要がありました。

<?php 

$file = '/tmp/file.pdf'; 
if(!file_exists($file)){
    die('Error: File not found: '.$file);
}
else
{

    // Set headers
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: application/pdf");
    header("Content-Transfer-Encoding: binary");
    readfile($file);
} 

?>

そうしないと、ダウンロード後にファイルを読み取ることができませんでした。

Hans Kuit が言ったように、ファイル名からパスを削除したほうがよいでしょう。

于 2012-07-07T14:22:57.237 に答える
1

if には多くの右括弧が必要です。次のようにする必要があります。

if(!file_exists($file)){

これがおそらくサーバー エラーの原因であり、サーバーを実行しているユーザーが外部の場所にアクセスできる場合、コードは機能するはずです。

于 2012-07-07T13:55:04.063 に答える