以下是PHP代码
图形化工具 Kodo Browser_实用工具_对象存储 - 七牛开发者中心
我这里是直接下载的sdk包解压,然后修改examples文件夹中的示例代码调用的。
目前是2种情况:
(1)从bucket_A整个批量复制到bucket_B
这种简单些,先获取批量的文件,再将批量的文件执行复制功能。
(2)从bucket_A复制指定的批量文件到bucket_B
这种是业务逻辑导致的,先从数据库获取需要复制的文件,再调用复制功能。
<?php
require 'autoload.php';
use Qiniu\Auth;
// 用于签名的公钥和私钥
$accessKey = '11';
$secretKey = '22';
// 初始化签权对象
$auth = new Auth($accessKey, $secretKey);
$config = new \Qiniu\Config();
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config);
//每次最多不能超过1000个
$keys = array(
"juplus2.0_cut_productList_1586484446_5e8fd4debec93.png",//原文件名
);
$keyPairs = array();
foreach ($keys as $key) {
$keyPairs[$key] = $key . "_copy";//新文件名加上了'_copy',其实不加也可以按自己的业务需求
}
$srcBucket = 'a';//源文件 bucket
$destBucket = 'b';//新的文件 bucket
$ops = $bucketManager->buildBatchCopy($srcBucket, $keyPairs, $destBucket, true);
list($ret, $err) = $bucketManager->batch($ops);
if ($err) {
print_r($err);
} else {
print_r($ret);
}
以下是laravel中命令行执行的代码,(本地win失败,linux上可以成功)
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Qiniu\Auth;
use Qiniu\Config;
use Qiniu\Storage\BucketManager;
/**
* 业务逻辑:
* (1)拉取需要迁移的所有文件名
* (2)执行复制命令:从源bucket至目录bucket
* 注:linux服务器可以执行成功,本地win不行 -_-!
* 1 php artisan make:command QiniuMove
* 2 打开app/Console/Kernel.php文件,找到$commands属性
* 3 \App\Console\Commands\QiniuMove::class,
* 4 打开cmd终端,执行 php artisan qiniumove:go
* Class QiniuMove
* @package App\Console\Commands
*/
class QiniuMove extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'qiniumove:go';
/**
* The console command description.
*
* @var string
*/
protected $description = '迁移七牛云资源到4.0';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
// 用于签名的公钥和私钥
$accessKey = '1';
$secretKey = '2';
$auth = new Auth($accessKey, $secretKey);
$config = new Config();
$bucketManager = new BucketManager($auth, $config);
$srcBucket = 'A';//源 样本汇(grundfos
$destBucket = 'B';//目标 bucket 样本汇(juplus
//每次最多不能超过1000个
$keys = array(
'juplus2.0_cut_productList_1590394043_5ecb7cbb7be25.png',
);
// $keys = $this->getKeys();
$keyPairs = array();
foreach ($keys as $key) {
$keyPairs[$key] = $key;//源文件名:目录文件名,这里新的文件名保持一致,我们不用修改
}
// print_r($keyPairs);exit;
$ops = $bucketManager->buildBatchCopy($srcBucket, $keyPairs, $destBucket, true);
list($ret, $err) = $bucketManager->batch($ops);
if ($err) {
echo "失败数:".count($err)."\n";
} else {
echo "成功数:".count($ret)."\n";
}
return 0;
}
/**
* 根据商家ID查询出所有的资源文件地址。(2.0和3.0)
* 需要复制的 所有文件名
* Undocumented function
* @return void
*/
function getKeys()
{
$keys = [
''
];
return $keys;
}
// 根据bucket name获取所有文件列表(一次最多1000个)获取存储桶中的文件列表
function getFileLists($bucketManager,$bucketName,$limit=5)
{
// $limit每次获取的文件数量
$marker = null;
$fileList = [];
$prefix = '';
$delimiter = '/';
// 列举文件
list($ret, $err) = $bucketManager->listFiles($bucketName, $prefix, $marker, $limit, $delimiter);
if ($err !== null) {
echo "\n====> list file err: \n";
var_dump($err);
} else {
if (array_key_exists('marker', $ret)) {
echo "Marker:" . $ret["marker"] . "\n";
}
echo "\nList Iterms====>\n";
//var_dump($ret['items']);
}
// print_r($ret['items']);
// [2] => Array
// (
// [key] => 0001.jpg
// [hash] => Fu7_-eFCXmGUudd3wkMej7e-kKVP
// [fsize] => 435639
// [mimeType] => image/jpeg
// [putTime] => 15705311541934141
// [type] => 0
// [status] => 0
// [md5] => 8f39939cd538d9012c1dd92a0a22bbc8
// )
$fileList = $ret['items'];//
return $fileList;
}
}
以下是PYTHON代码
Python SDK_SDK 下载_对象存储 - 七牛开发者中心
# -*- coding: utf-8 -*-
"""
批量拷贝文件
https://developer.qiniu.com/kodo/api/1250/batch
"""
from qiniu import build_batch_copy, Auth, BucketManager
access_key = '1';
secret_key = '2';
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
src_bucket_name = 'a'
target_bucket_name = 'b'
def getAllFiles():
return {
"a.png":"a.png",
"b.png":"b.png",
}
# print(getAllFiles())
# exit()
file_lists = getAllFiles()
ops = build_batch_copy(src_bucket_name, file_lists, target_bucket_name, force='true')
ret, info = bucket.batch(ops)
print(info)
结束。