七牛云存储OSS数据迁移与复制bucket和laravel中使用

以下是PHP代码

PHP SDK_SDK 下载_对象存储 - 七牛开发者中心

图形化工具 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)


结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值