У меня было что-то (вроде) подобное с одним клиентом. Они хотели, чтобы посетители заполняли форму с некоторой информацией перед загрузкой файлов, которые могли быть на любой странице.
По сути, я создал папку в 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+
in _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...
}
}
}
Это довольно быстрое решение и, вероятно, может быть немного лучше, но должно дать вам хорошее начало_
person
colymba
schedule
24.05.2013