web-dev-qa-db-ja.com

Webディレクトリ外のファイルをダウンロードする

次のように、特定のファイルがドキュメントルートディレクトリの外部に格納されるシナリオがあります...

/home/user/public_html/{drupal files are in here}
/home/user/data/{special data files are in here}

Drupalの組み込みファイルラッパーを使用して、特別な権限を持つユーザーが/ home/user/dataからファイルをダウンロードできるようにしたいのですが、ファイルへのリンク方法がわかりません。

補遺:ほとんどのファイルは通常の場所に保存されています:

/home/user/public_html/sites/default/files

外部データフォルダーに保存する必要があるのは、その一部だけです。セキュリティ上の理由から、sites/default/files /ディレクトリを/ home/user/dataに変更したくありません。

2
Codeblind

Drupal 6はプライベートファイルとパブリックファイルの両方を有効にすることをサポートしていませんが、これを提供するいくつかのモジュールがあります(例 http://drupal.org/project/private_download )。

そのモジュールがあなたの必要とすることをしないなら、あなた自身で書くこともできます、インスピレーションを得るために file_download() を見てください。これは、PHPを介して非公開ファイルを提供するページコールバックであり、hook_file_download()でアクセスをチェックします。

3
Berdir

私は* nixは苦手ですが、このディレクトリへのシンボリックリンクをpublic_html /およびcmod -R 777から外部フォルダに作成する必要があると思います。

1
dobeerman

私はセキュリティ上の理由からこれをいつもしています。

1)open_basedirを設定して、Webサーバーのdocrootの外部にあるファイルを保存するディレクトリを含める必要があります。

2)そのユーザーだけがアクセスできるページにダウンロードリンク/ボタンを配置するなど、ファイルを確実に取得できるようにするには、別のロジックが必要です。

3)許可された人があなたの特別なダウンロードリンクにアクセスすると、docrootの外の目的のファイルでfile_get_contents()などを使用するロジックがトリガーされます。これは、目的のファイルのディレクトリを知るようにopen_basedirを設定したために可能です

4)これで、変数に目的のファイルができました。このルーチンに渡すだけで、ユーザーのブラウザーが「ファイルの保存」ダイアログをポップします。ファイルはユーザーにプルされるのではなく、プッシュされます。タダ!

/***************************************************************************************************
* Prompt the user to download the passed string as a file.
*/
function _Push_download( $output, $filename ) 
{
  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: private");
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=$filename");
  header("Accept-Ranges: bytes");
  echo $output;
  exit;
}
1
Blake Senftner