Php 让CakeS3在CakeShell中工作
我希望能够从蛋糕外壳调用CakeS3插件。但是,据我所知,不能从shell加载组件。我读过这篇概述克服它的策略的文章:-然而,我没有成功。这里的CakeS3代码类似于我应用程序其余部分中功能完美的CakeS3代码Php 让CakeS3在CakeShell中工作,php,cakephp,amazon-s3,Php,Cakephp,Amazon S3,我希望能够从蛋糕外壳调用CakeS3插件。但是,据我所知,不能从shell加载组件。我读过这篇概述克服它的策略的文章:-然而,我没有成功。这里的CakeS3代码类似于我应用程序其余部分中功能完美的CakeS3代码 <?php App::uses('Folder','Utility'); App::uses('File','Utility'); App::uses('CakeS3.CakeS3','Controller/Component'); class S3Shell extends
<?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";
}
}
我认为应用程序:使用的
应该是:
App::uses('CakeS3', 'CakeS3.Controller/Component');
请原谅我这个“广告”…)但是如果它使用的组件应该是一个模型或行为任务,那么它的编写和架构可能比这个CakeS3插件更好。它也是为您所拥有的用例而设计的。此外,它支持的存储系统比S3多几个
例如,您可以在shell中执行此操作:
StorageManager::adapter('S3')->write($key, StorageManager::adapter('Local')->read($key));
一个文件应该作为一个单独的实体来处理,该实体与它需要关联的任何东西相关联。每个上传的文件(如果您使用或扩展插件附带的模型,如果没有,您必须注意)都存储为单个数据库条目,其中包含所使用配置的名称和该文件的一些元数据。如果您在shell中执行上面的代码行,那么如果以后希望以这种方式访问该记录,则必须在表中保留该记录。只需查看表中的示例即可。您不必使用数据库表作为文件的引用,但我确实推荐插件实现的系统
此外,您可能不知道WWW_ROOT是可公开访问的,因此在您将敏感数据存储在那里的情况下,它可以公开访问
最后,在shell中,您不应该使用echo,而应该使用正确的shell输出。我是CakeS3的作者,不,恐怕没有“受支持”的方法来实现这一点,因为当我们构建这个插件时,我们不需要从shell运行上传,只需要从控制器到S3的一个简单接口。然后我们将插件作为一个简单的S3连接器进行开源
如果您想尝试修改它以支持shell访问,我欢迎PR
我没有插件的特定路线图,所以我在GITHUB上标记了你的问题作为一个增强,当然会在未来的发展中考虑它,但是我不能保证它符合你的时间要求,所以我才提到你做PRP。
你有什么建议让当前的插件工作吗?我可能会添加你的,但我的应用程序的主要部分中已经有大量代码使用插件来回答这个问题。如果需要的话,我会试试你的,但我觉得有点奇怪,有两个插件在一个应用程序中做同样的事情。