我和一位客户有过类似的事情(有点)。他们希望访问者在下载一些可能在任何页面上的文件之前填写一份包含一些信息的表格。
基本上我所做的是在 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...
}
}
}
这是一个非常快速的解决方案,可能会更好一些,但应该会给你一个好的开始_