七空幻音LOGO

七空幻音

腾讯对象储存cos一键下载&上传&删除辅助脚本2017-06-01 00:42:22

用过腾讯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下配置一下申请的秘钥.

然后脚本文件如下:XtCosTools.class.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条评论登录后可见

用户头像
幻音い
咕了咕了咕了....

文章:125

收藏:3

查看更多
详细图片
载入中...