【138】七牛云两个账户之间数据迁移

假定有两个七牛云账户甲、乙。需要把数据从甲转移到乙。
在七牛云网站,登录乙账户,进入管理控制台,如图:
在这里插入图片描述

在管理控制台,点击左侧菜单的对象存储,如图:
在这里插入图片描述
在左侧的存储空间列表中,点击乙账户准备接收数据的存储空间列表,点击空间授权tab页,一定要选择读写权限。授权用户填写甲的注册邮箱,重命名空间是指乙的空间在甲账户中的显示名称。如图:

在这里插入图片描述

我假设甲账户存储空间是bucket1,乙账户存储空间名称是bucket2。上面空间授权的时候,重命名空间设置成bucket2-a。

打开链接 https://developer.qiniu.com/kodo/tools/1302/qshell

下载qshell工具,我下载的是windows版。我下载后把exe文件放到目录 D:\program\qshell 下。
修改系统变量,右击我的电脑 > 点击属性 > 高级系统设置 > 高级选项卡 > 环境变量。
在 Path后面添加 D:\program\qshell 。配置完后打开命令行,输入 qshell -v 命令显示版本信息表示环境变量同步成功。

七牛云登录甲账户,在个人中心 > 密钥管理 里面可以找到 AK 和 SK。
在我的Windows电脑命令行里输入如下命令:

qshell account AK SK zhangchao

这样可以在本地保存甲账户。其中zhangchao是用户名,可以随便设置。
命令 qshell user ls 显示本地保存的用户。

我们需要导出七牛云上存储的文件名称,执行如下命令:

qshell listbucket bucket1 -o t1.txt

bucket1 是甲账户上要移出的存储空间,t1.txt 是保存到本地的文件。t1.txt 文件的格式类似这种:

008949-bebdd88454e5.png	75827	FoEO863vyjMlPlEcx-jdPPWzn6UA	15512365611276761	image/png	0	
729-9e61a2d1580c.png	76769	FsZV9QhcTGuAq74ORqTs6aZu21Q1	15533448935124957	image/png	0	
4bb851f7097e13c.jpg	66356	Fqp0T032DfG3hvQmXwayYqaJdx3b	15730361897437573	image/jpeg	0	

我们只需要保留第一列。因此我们需要对源文件处理一下。

我写了一段代码来处理文件,输入文件是 D:\tempfile\t1.txt ,输出文件是D:\tempfile\t2.txt。代码如下:

package zhangchao.qiniufile;

import java.io.*;
import java.util.ArrayList;

/**
 * 
 * @author zhangchao
 */
public final class Main {
    public static boolean isBlank(String str) {
        if (null == str) {
            return true;
        }
        if (0 == str.length()) {
            return true;
        }
        if (0 == str.trim().length()) {
            return true;
        }
        return false;
    }

    /**
     * 读取文件,获得七牛云的文件名
     * @return  七牛云的文件名
     */
    public static ArrayList<String> readFile() {
        ArrayList<String> strList = new ArrayList<String>();
        File inputFile = new File("D:\\tempfile\\t1.txt");
        FileInputStream fis = null;
        BufferedReader br = null;
        try {
            // 读取文件第一列,文件名
            fis = new FileInputStream(inputFile);
            br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
            String str = null;
            str = br.readLine();
            while (null != str) {
                if (false == isBlank(str)) {
                    str = str.trim();
                    String[] arr = str.split("\t");
                    strList.add(arr[0]);
                }
                str = br.readLine();
            }
            strList.trimToSize();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                if (null != fis) {
                    fis.close();
                }
                if (null != br) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return strList;
    }

    public static void writeFile(ArrayList<String> strList) {
        File outputFile = new File("D:\\tempfile\\t2.txt");
        FileOutputStream fos = null;
        BufferedWriter bw = null;
        try {
            fos = new FileOutputStream(outputFile);
            bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
            for (String str : strList) {
                bw.write(str);
                bw.newLine();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                if (null != bw) {
                    bw.flush();
                    bw.close();
                }
                if (null != fos) {
                    fos.flush();
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ArrayList<String> strList = readFile();
        writeFile(strList);
    }
}

运行程序,生成t2.txt 文件。最后执行命令:

qshell batchcopy bucket1 bucket2-a -i t2.txt -w

就可以把文件从甲账户复制到乙账户。bucket1 是甲账户要移出的存储空间,bucket2-a 是乙账户存储空间bucket2 的重命名空间。-w表示重名文件进行覆盖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章