假定有两个七牛云账户甲、乙。需要把数据从甲转移到乙。
在七牛云网站,登录乙账户,进入管理控制台,如图:
在管理控制台,点击左侧菜单的对象存储,如图:
在左侧的存储空间列表中,点击乙账户准备接收数据的存储空间列表,点击空间授权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表示重名文件进行覆盖。