私はあるクライアントに似たようなことがありました。彼らは、どのページにもある可能性のあるファイルをダウンロードする前に、訪問者にフォームに情報を入力してもらいたいと考えていました。
基本的に私がしたことは、AssetAdmin の下にフォルダーを作成し、FilteredDownload
そのフォルダー内の任意の場所がフィルタリング (フォームなど) を通過することです。
私はこのルールを.htaccess
(編集することができます...)これらのファイルのいずれかにリクエストをリダイレクトしますDownloader_Controller
RewriteCond %{REQUEST_URI} /assets/FilteredDownload [NC]
RewriteCond %{REQUEST_URI} !/assets_temp [NC]
RewriteCond %{REQUEST_FILENAME} \.(pdf|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx)$ [NC]
RewriteRule .* downloader?file=%{REQUEST_FILENAME}&%{QUERY_STRING} [L,NC]
次に、そのコントローラーを使用して、フォームとファイルをサーバーに配置しました。
あなたの場合、そのコントローラーを使用して、訪問者がログインしているかどうかをテストし、そうでない場合はログインページにリダイレクトしたり、アクセスを拒否したりできます...
あなたの問題とまったく同じではありませんが、これが適応されているのは簡単にわかりますか?
編集
それをよく見て、上記に基づいて、これはうまくいくようです:
シルバーストライプ 3+
これをに追加.htaccess
:
RewriteCond %{REQUEST_URI} /assets/MembersOnly [NC]
RewriteCond %{REQUEST_FILENAME} \.(pdf|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx)$ [NC]
RewriteRule .* filedownloadpermission?file=%{REQUEST_FILENAME}&%{QUERY_STRING} [L,NC]
したがって、アップロードされたすべてのファイルは、ダウンロード前に/assets/MembersOnly
最初にリクエストが通過し/filedownloadpermission
ます。
Director
でルールを定義しconfig.yml
ます。
---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
rules:
'filedownloadpermission/$Action/$ID/$Name': 'FileDownloadPermission_controller'
次にFileDownloadPermission_controller.php
、ファイルを提供する前にパーミッションをチェックするコントローラー:
<?php
class FileDownloadPermission_controller extends ContentController
{
private static $allowed_actions = array (
);
public function init() {
parent::init();
if( !$member = Member::currentUser() )
{
Security::permissionFailure();
}
}
public function index()
{
$file = $this->request->getVar('file');
$fileAssetPath = substr($file, stripos($file, 'assets'));
$fileObj = File::get()->filter(array('Filename' => $fileAssetPath))->first();
if ( $fileObj )
{
$data = file_get_contents( $fileObj->getFullPath() );
$name = $fileObj->getFilename();
$response = SS_HTTPRequest::send_file($data, $name);
return $response;
}
else {
//Return 404 or whatever...
}
}
}
これは実際には SilverStripe 3.1 用に書かれていますが、2.4 にも簡単に適用できます。
$allowed_actions
する必要がありますpublic
Director
_config.php
代わりに追加するルール
File::get()...
に更新DataObject::get...
これにより、SilverStripe 2.4+が提供されます。
の_config.php
Director::AddRules(100, array('filedownloadpermission/$Action/$ID/$OtherID' => 'FileDownloadPermission_controller'));
そして私たちのコントローラーFileDownloadPermission_controller.php
:
<?php
class FileDownloadPermission_controller extends ContentController
{
static $allowed_actions = array (
);
public function init() {
parent::init();
if( !$member = Member::currentUser() )
{
Security::permissionFailure();
}
}
public function index()
{
$file = $this->request->getVar('file');
$fileAssetPath = substr($file, stripos($file, 'assets'));
$fileObj = DataObject::get(
"File",
"Filename = '".$fileAssetPath."'",
null, null, "1");
if ( $fileObj )
{
$fileObj = $fileObj->shift();
$data = file_get_contents( $fileObj->getFullPath() );
$name = $fileObj->getFilename();
$response = SS_HTTPRequest::send_file($data, $name);
return $response;
}
else {
//Return 404 or whatever...
}
}
}
これは非常に迅速な解決策であり、おそらくもう少し良くなる可能性がありますが、良いスタートが切れるはずです_