用过腾讯cos对象储存的知道...用起来真烦人..删除文件夹的话需要把文件夹下所有文件都删掉了才可以删除,而且还不能批量删除,这是最气的....而且还不能批量下载...上传的话到是可以批量上传文件.
还好腾讯cos提供了api,但是这个api删除文件夹同样需要把文件夹下所有文件删除才可以删文件夹.......
所以我就昨天就研究了一下,然后写了一个php脚本来执行一键上传下载删除的方法.
首先需要去腾讯对象储存申请一个秘钥:https://console.qcloud.com/cos4/secret
然后去下载php的sdk文件:https://mc.qcloudimg.com/static/archive/5ac534d6c4af2462b3996c8a4d9c3b06/cos-php-sdk-v4-master.zip
然后拿到sdk先在qcloudcos/conf.php下配置一下申请的秘钥.
<?php
/**
* @Name 腾讯对象储存CosPHP辅助脚本
* @Author 幻音丶小涛
* @Website https://www.acgxt.com
* @Time 2017-05-31 14:17:28
* 使用命令:
* sudo php run.php -l / 列出这个bucket的文件列表
* sudo php run.php -l /js/ 列出这个bucket下的js文件夹的所有列表
* sudo php run.php -R / 删除整个cos对象储存文件列表
* sudo php run.php -R /js/ 删除cos下的js文件夹所有文件包括文件夹
* sudo php run.php -r 1.txt 删除cos下的1.txt文件
* sudo php run.php -dl / 将整个cos下载到当前文件夹
* sudo php run.php -dl /js/ 将cos下的js文件夹所有文件下载到当前目录的./js/文件夹内
* sudo php run.php -dl /js/ ./download/ 将cos下的js文件夹所有文件下载到./download/文件夹内(download需要自己手动创建)
* sudo php run.php -up 将当前目录的所有文件上传到cos的根目录下
* sudo php run.php -up ./file/ 将本地的./file/文件夹上传到cos根目录下
* sudo php run.php -up ./file/ /upload/ 将本地的./file/文件夹上传到cos下的/upload/文件内(upload会自动创建)
* sudo php run.php -up ./1.txt 将本地的./1.txt文件上传到cos根目录
* sudo php run.php -up ./1.txt /upload/ 将本地的./1.txt文件上传到cos下的/upload/文件夹内(upload会自动创建)
*/
namespace Xt\Tools;
use qcloudcos\Cosapi;
class XtCosTools{
private $bucket = null;
public function __construct($bucket,$args){
if(substr(php_sapi_name(), 0, 3) !== 'cli')die("cos辅助脚本文件必须在cli模式下运行哦!.\n");
$this->bucket = $bucket;
if(count($args)==1){
$this->help();
}
$type = isset($args[1])?$args[1]:null;
switch($type){
case '-R':
if(!isset($args[2])){
echo "\033[31m-R [文件夹名称] 删除文件夹下所有文件包括文件夹\n";
exit;
}
$this->removeDirAll($args[2]);
echo "\033[33m删除文件夹{$args[2]}下的所有文件完成\n";
break;
case '-r':
if(!isset($args[2])){
echo "\033[31m-r [文件名称] 删除指定文件\n";
exit;
}
try{
$this->removeFile($args[2]);
echo "\033[32m删除文件{$args[2]}成功\n";
}catch(\Exception $e){
echo "\033[31m删除文件{$args[2]}失败:{$e->getMessage()}\n";
}
break;
case '-up':
if(isset($args[2])){
if(!file_exists($args[2])){
echo "\033[31m本地文件或文件夹{$args[2]}无法找到...\n";
exit;
}else{
$dir = $args[2];
}
}else{
$dir = './';
}
$cosDir = "/";
if(isset($args[3])){
$cosDir = $args[3];
$r = Cosapi::statFolder($this->bucket,$cosDir);
if($r['code']!=0){
echo "\033[31m无法找到目录{$cosDir}:{$r['message']}\n";
exit;
}
}
$this->upload($dir,$cosDir);
echo "\033[36m上传cos_bucket_{$bucket}全部完成!\n";
break;
case '-dl':
if(!isset($args[2])){
echo "\033[31m-dl [文件夹名称] [输出的文件夹] 将cos指定文件夹资源下载到指定文件夹(根目录为/)\n";
exit;
}
if(isset($args[3])){
if(!is_dir($args[3])){
echo "\033[31m{$args[3]}这个目录无法找到...\n";
exit;
}else{
$dir = $args[3];
}
}else{
$dir = null;
}
$this->getList($args[2],2,$dir);
echo "\033[36m下载cos_bucket_{$bucket}全部完成!\n";
break;
case '-l':
if(!isset($args[2])){
echo "\033[31m-l [文件夹名称] 获取指定文件夹下的文件(根目录为/)\n";
exit;
}
$this->getList($args[2],1);
break;
case '-h':
echo "\033[33msudo php run.php -l / 列出这个bucket的文件列表\nsudo php run.php -l /js/ 列出这个bucket下的js文件夹的所有列表\nsudo php run.php -R / 删除整个cos对象储存文件列表\nsudo php run.php -R /js/ 删除cos下的js文件夹所有文件包括文件夹\nsudo php run.php -r 1.txt 删除cos下的1.txt文件\nsudo php run.php -dl / 将整个cos下载到当前文件夹\nsudo php run.php -dl /js/ 将cos下的js文件夹所有文件下载到当前目录的./js/文件夹内\nsudo php run.php -dl /js/ ./download/ 将cos下的js文件夹所有文件下载到./download/文件夹内(download需要自己手动创建)\nsudo php run.php -up 将当前目录的所有文件上传到cos的根目录下\nsudo php run.php -up ./file/ 将本地的./file/文件夹上传到cos根目录下\nsudo php run.php -up ./file/ /upload/ 将本地的./file/文件夹上传到cos下的/upload/文件内(upload会自动创建)\nsudo php run.php -up ./1.txt 将本地的./1.txt文件上传到cos根目录\nsudo php run.php -up ./1.txt /upload/ 将本地的./1.txt文件上传到cos下的/upload/文件夹内(upload会自动创建)\n";
exit;
break;
}
}
private function help(){
echo "\033[33m--XtCosTools_PHP辅助脚本命令列表\033[0m\n";
echo " -R [文件夹名称] 删除文件夹下所有文件包括文件夹\n";
echo " -r [文件名称] 删除指定文件\n";
echo " -dl [文件夹名称] [输出的文件夹] 将cos指定文件夹资源下载到指定文件夹(根目录为/)\n";
echo " -up [本地文件或文件夹名称] [cos上的文件夹(默认根目录)] 将指定文件或文件夹上传到cos上的文件夹内\n";
echo " -l [文件夹名称] 获取指定文件夹下的文件(根目录为/)\n";
echo " -h 详细的说明\n";
echo "By:幻音丶小涛,https://www.acgxt.com\n";
exit;
}
private function upload($dir,$cos){
if(is_dir($dir)){
$r = scandir($dir);
if(substr($dir,0,2)=="./"){
$dirs=substr($dir,2);
}else if(substr($dir,0,1)=="/") {
$dirs = substr($dir,1);
}else{
$dirs = $dir;
}
foreach($r as $v){
if($v=='.'||$v=='..')continue;
if(is_file($dir.$v)){
$this->uploadFile($dirs.$v,$cos);
}else if(is_dir($dir.$v)){
$cosDir = $cos.$dirs.$v.'/';
$result = Cosapi::statFolder($this->bucket, $cosDir);
if($result['code']==0){
$this->upload($dir.$v.'/',$cos);
}else{
Cosapi::createFolder($this->bucket,$cosDir);
//腾讯云api可能创建成功也会code!=0
$this->upload($dir.$v.'/',$cos);
}
}
}
}else if(is_file($dir)){
$r = $dir;
$this->uploadFile($r,$cos);
}
}
private function uploadFile($file,$cosDir){
echo "\033[33m开始上传{$file}->{$cosDir}{$file}\n";
$ret = Cosapi::upload($this->bucket, $file, $cosDir.$file);
if($ret['code']==0){
echo "\033[32m上传到{$cosDir}{$file}成功!\n";
}else{
echo "\033[31m上传到{$cosDir}{$file}失败...{$ret['message']}!\n";
}
}
private function getList($folder,$o=0,$d=null){
$data = [];
$result = Cosapi::listFolder($this->bucket, $folder);
if($result['code']!=0){
echo "\033[31m查询cos_bucket错误:{$result['message']}";
exit;
}
foreach($result['data']['infos'] as $k=>$v){
if(substr($v['name'],-1)=="/"){
if($o==1)echo "\033[33m\033[4m".$folder.$v['name']."\033[0m\n";
$data[$v['name']] = $this->getList($folder.$v['name'],$o);
}else{
if($o==1)echo "\033[32m".$folder.$v['name']."\n";
if($o==2){
if(isset($v['source_url'])){
$this->autoCreateDir('.'.$folder);
echo "\033[32m开始下载:{$v['source_url']}\n";
if(is_null($d)){
$dir = ".".$folder;
}else{
$dir = $d;
}
shell_exec("cd {$dir} &&wget -q -O \"{$v['name']}\" {$v['source_url']}");
if(is_file($dir.$v['name'])){
echo "\033[33m下载成功,保存在:".$dir.$v['name']."\n";
}else{
echo "\033[31m下载{$v['source_url']}失败....\n";
}
}
}
array_push($data,$folder.$v['name']);
}
}
return $data;
}
private function autoCreateDir($dir){
if(!is_dir($dir)){
if(!is_dir(dirname($dir)))$this->autoCreateDir(dirname($dir));
mkdir($dir);
}
}
private function removeDirAll($dir){
$list = $this->getList($dir);
foreach($list as $k=>$v){
if(is_array($v)){
if(count($v)==0){
try{
$this->removeDir($dir.$k);
echo "\033[32m删除文件夹{$dir}{$k}成功\n";
}catch(\Exception $e){
echo "\033[31m删除文件夹{$dir}{$k}失败:{$e->getMessage()}\n";
}
}else{
$this->removeDirAll($dir.$k);
try{
$this->removeDir($dir.$k);
echo "\033[32m删除文件夹{$dir}{$k}成功\n";
}catch(\Exception $e){
echo "\033[31m删除文件夹{$dir}{$k}失败:{$e->getMessage()}\n";
}
}
}else{
try{
$this->removeFile($v);
echo "\033[32m删除文件{$v}成功\n";
}catch(\Exception $e){
echo "\033[31m删除文件{$v}失败:{$e->getMessage()}\n";
}
}
}
}
private function removeFile($file){
$result = Cosapi::stat($this->bucket, $file);
if($result['code']==0){
$result = Cosapi::delFile($this->bucket, $file);
if($result['code']==0){
return true;
}else{
throw new \Exception($result['message']);
}
}
}
private function removeDir($dir){
$result = Cosapi::statFolder($this->bucket, $dir);
if($result['code']==0){
$result = Cosapi::delFolder($this->bucket, $dir);
if($result['code']==0){
return true;
}else{
throw new \Exception($result['message']);
}
}
}
}
//坑比腾讯cos....也可以选择下载:https://static.acgxt.com/file/XtCosTools.class.php.tar.gz
将脚本文件放到腾讯cos的sdk文件根目录内
然后打开sample.php文件
修改里面的代码(直接全部删除把,然后复制下面的)
<?php
require('./include.php');
require './XtCosTools.class.php';
use qcloudcos\Cosapi;
Cosapi::setTimeout(0);
// 设置COS所在的区域,对应关系如下:
// 华南 -> gz
// 华中 -> sh
// 华北 -> tj
// 华东 -> sh
Cosapi::setRegion('sh');
$bucket = '';//对象储存桶名称
(new \Xt\Tools\XtCosTools($bucket,$argv));脚本文件请在cli下运行
-R [文件夹名称] 删除文件夹下所有文件包括文件夹 -r [文件名称] 删除指定文件 -dl [文件夹名称] [输出的文件夹] 将cos指定文件夹资源下载到指定文件夹(根目录为/) -up [本地文件或文件夹名称] [cos上的文件夹(默认根目录)] 将指定文件或文件夹上传到cos上的文件夹内 -l [文件夹名称] 获取指定文件夹下的文件(根目录为/) -h 详细的说明
sudo php run.php -l / 列出这个bucket的文件列表 sudo php run.php -l /js/ 列出这个bucket下的js文件夹的所有列表 sudo php run.php -R / 删除整个cos对象储存文件列表 sudo php run.php -R /js/ 删除cos下的js文件夹所有文件包括文件夹 sudo php run.php -r 1.txt 删除cos下的1.txt文件 sudo php run.php -dl / 将整个cos下载到当前文件夹 sudo php run.php -dl /js/ 将cos下的js文件夹所有文件下载到当前目录的./js/文件夹内 sudo php run.php -dl /js/ ./download/ 将cos下的js文件夹所有文件下载到./download/文件夹内(download需要自己手动创建) sudo php run.php -up 将当前目录的所有文件上传到cos的根目录下 sudo php run.php -up ./file/ 将本地的./file/文件夹上传到cos根目录下 sudo php run.php -up ./file/ /upload/ 将本地的./file/文件夹上传到cos下的/upload/文件内(upload会自动创建) sudo php run.php -up ./1.txt 将本地的./1.txt文件上传到cos根目录 sudo php run.php -up ./1.txt /upload/ 将本地的./1.txt文件上传到cos下的/upload/文件夹内(upload会自动创建)
最后六一儿童节快乐啊(最近发现好喜欢写php脚本...)
1条评论登录后可见