web-dev-qa-db-ja.com

ビューPHP-プライベートファイルへのダウンロードリンクを作成する

特定のユーザー役割のみがアクセスできるビューページがあります。このユーザーロールには、「プライベートファイルの表示」および「ドキュメント:ファイルのダウンロード」( ファイルエンティティモジュール からアクセス)する権限もあります。ビューページには、プライベートファイルディレクトリにあるすべてのプライベート.pdfファイルのテーブルが表示されます。 Views PHP フィールドを使用して、このテーブルに列を追加します(少なくともプロトタイピング用)。ファイル名の横に対応するダウンロードリンクが表示されます。上記のように、テーブルを表示できるすべてのユーザーは、プライベートファイルを表示し、ドキュメントをダウンロードする権限も持っているため、これは実行可能であり、セキュリティの問題ではありません。

ここでは、fixedプライベート.pdfファイルへのダウンロードリンクを常に表示したいとします。たとえば、ファイルIDは_$fid=17_です。 Drupalでのファイルの操作 によれば、

いったん設定すると、プライベートディレクトリに保存されているファイルには、直接リンクを介してアクセスできなくなります。ただし、Drupalがファイルへのリンクを作成する場合、そのファイルは、リンクを見ることができるすべてのユーザーがアクセスできます。

「if Drupalがファイルへのリンクを構築する」とはどういう意味ですか?ユーザーがアクセスできる場合、file_create_url()が直接リンクを作成することを何度も読みましたプライベートファイルを表示するには、ユーザーをプライベートファイルに移動します。そのため、ビューPHPフィールドを出力コードとして試しました

_<?php
$fid = 17;
$file = file_load($fid);
$uri = $file->uri;
$url = file_create_url($uri);
print l(t('Link'), $url);
?>
_

リンクが正しく表示されます(mysite.com/system/files/Name_Of_Private_File_17.pdfを参照)。ただし、ユーザーがプライベートドキュメントファイルを表示およびダウンロードする権限を持っている場合でも、リンクをクリックすると、「アクセスが拒否されました。このページへのアクセスは許可されていません。」

誰かが正しい回避策を教えてくれますか?

3
deinqwertz

「ファイル:ダウンロードリンク」フィールドをビューに追加すると、正常に機能します。

「ファイル:ダウンロードリンク」のビューフィールドハンドラには、アクセスをチェックする次のスニペットがあります。

if (!file_entity_access('download', $file)) {
   return;
}

そして、このスニペットは、ダウンロードリンクのURIを構築します。

$uri = file_entity_download_uri($file);

File_entity_download_uri()のコード:

function file_entity_download_uri($file) {
  $uri = array(
    'path' => "file/{$file->fid}/download",
    'options' => array(),
  );
  if (!variable_get('file_entity_allow_insecure_download', FALSE)) {
    $uri['options']['query']['token'] = file_entity_get_download_token($file);
  }
  return $uri;
}

返される$ uriのオプションクエリキーに追加されるダウンロードトークンを示します。

これをPHPコードフィールドに追加します。

<?php
    $fid = $row->fid;
    $file = file_load($fid);
    if (file_entity_access('download', $file)) {
        $uri = file_entity_download_uri($file);
        print l(t('Download'), $uri['path'], array('query' => $uri['options']['query']));
    }
?>

プライベートファイルへのダウンロードリンクが表示されます。

4
J. Reynolds