让CakeS3在CakeShell中工作

时间:2013-07-11 20:13:55

标签: php cakephp amazon-s3

我希望能够从Cake Shell调用CakeS3插件。但是,据我所知,它无法从shell加载组件。我已经阅读了这篇文章,概述了克服它的策略:using components in Cakephp 2+ Shell - 然而,我没有成功。这里的CakeS3代码类似于我的应用程序其余部分中功能完善的蛋糕S3代码。

<?php
App::uses('Folder','Utility');
App::uses('File','Utility');
App::uses('CakeS3.CakeS3','Controller/Component'); 
class S3Shell extends AppShell {
public $uses = array('Upload', 'User', 'Comment');


public function main() {

    $this->CakeS3 = new CakeS3.CakeS3(
     array(
        's3Key' =>  'key',        
        's3Secret' => 'key',      
        'bucket' => 'bucket')

    ); 
    $this->out('Hello world.');
    $this->CakeS3->permission('private');
    $response = $this->CakeS3->putObject(WWW_ROOT . '/file.type' , 'file.type', $this->CakeS3->permission('private'));
                    if ($response ==  false){
                    echo "it failed";
                    } else {
                    echo "it worked"; 
                    }
}

这会在/home/app/Console/Command/S3Shell.php中找到“致命错误:类'CakeS3'的错误。我试图让它工作的主要原因是我可以自动执行一些上传有一个cron。当然,如果有更好的方法,我都是耳朵。

3 个答案:

答案 0 :(得分:1)

请原谅我这个“广告”...;)但my plugin可能写得更好,并且拥有比这个CakeS3插件更好的架构,如果它使用的组件应该是模型或行为任务。它也是为了你的用例而准备的。此外,它还支持比S3更多的存储系统。

你可以在你的shell中做到这一点:

StorageManager::adapter('S3')->write($key, StorageManager::adapter('Local')->read($key));

文件应作为一个实体来处理,并与需要关联的任何内容相关联。每个上传的文件(如果你使用或扩展插件附带的模型,如果不是你必须要处理它)被存储为单个数据库条目,其中包含所使用的配置的名称和一些元数据。文件。如果你在shell中执行上面的代码行,如果你想稍后以这种方式访问​​它,你将不得不在表中保留记录。只需查看readme.md中的示例即可。您不必使用数据库表作为对文件的引用,但我真的建议插件实现的系统。

此外,您可能不知道WWW_ROOT是公共可访问的,因此如果您将敏感数据存储在那里,则可以公开访问它。

最后在shell中你不应该使用echo而是使用$this->out()来获得正确的shell输出。

答案 1 :(得分:0)

我认为App:uses应该是这样的:

App::uses('CakeS3', 'CakeS3.Controller/Component');

答案 2 :(得分:0)

我是CakeS3的作者,并且我不担心没有“支持”方式来做这个,因为当我们构建这个插件时,我们不需要从shell运行上传而只需要一个简单的界面从我们的控制器到S3。然后我们将插件作为简单的S3连接器开源。

如果您想修改它以支持shell访问,我欢迎PR。

我没有针对该插件的特定路线图,所以我在github上将您的问题标记为增强版,并且在将来的开发中肯定会考虑它,但我无法保证它符合您的时间要求这就是为什么我提到你做公关。