前话: 最近比较闲,用了百度/google/360/金山云盘,想用云盘开发自己的程序API来上传下载文件,之前了解过百度云存储API,我从来没有试过,所以我今天试过。空间似乎是1TB,确实挺大的。只有在样本中循环上传文件进行测试,才写不到1GB。360似乎也有云API;百度除了BCS还有PCS,应该取代BCS,明天可以试试。不过BCS SDK相比之下,非常不专业JDK规范性差很多。
package com.test;
import java.io.File;
import com.baidu.inf.iis.bcs.BaiduBCS;
import com.baidu.inf.iis.bcs.auth.BCSCredentials;
import com.baidu.inf.iis.bcs.model.ObjectListing;
import com.baidu.inf.iis.bcs.model.ObjectMetadata;
import com.baidu.inf.iis.bcs.model.ObjectSummary;
import com.baidu.inf.iis.bcs.request.GetObjectRequest;
import com.baidu.inf.iis.bcs.request.ListObjectRequest;
import com.baidu.inf.iis.bcs.request.PutObjectRequest;
import com.baidu.inf.iis.bcs.response.BaiduBCSResponse;
public class Main
{
/**
* 百度云存储APP固定字段的服务器
*/
static String host = "bcs.duapp.com";
/**
* 开发人员自己建立的存储池
*/
static String bucket = "kitphoto";
/**
* 上传文件夹到百度云存储
*/
static String inputFileDir = "C:\\photo\\input\\";
/**
* 从百度云存储池下载文件到目录
*/
static String outputFileDir = "C:\\photo\\output\\";
/**
* @param args
*/
public static void main(String[] args){
// access 和secret key申请参考http://developer.baidu.com/wiki/index.php?title=docs/cplat/stor/guide
BCSCredentials credentials = new BCSCredentials("your access key",
"your secret key");
BaiduBCS baiduBCS = new BaiduBCS(credentials, host);
baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8
clearBucket(baiduBCS, bucket);
putFilesByDir(baiduBCS, inputFileDir, "/input/");
//getFilesByDir(baiduBCS, outputFileDir, "/input/");
}
/* 测试使用 */
static int count = 0;
/**
* 上传单个文件BCS上
* @param baiduBCS
* @param file :待上传的文件对象
* @param dir : 文件在BCS上的路径
*/
private static void putObjectByFile(BaiduBCS baiduBCS, File file, String dir)
{
count ;
PutObjectRequest request = new PutObjectRequest(bucket, dir "t" count file.getName(), file);
ObjectMetadata metadata = new ObjectMetadata();
// metadata.setContentType("text/html");
request.setMetadata(metadata);
BaiduBCSResponse response = baiduBCS.putObject(request);
ObjectMetadata objectMetadata = response.getResult();
System.out.println("Upload file :" file.getName());
}
/**
* 清空BCS上bucket,遍历bucket下面的内容,逐一删除
* @param baiduBCS
* @param bucket
*/
private static void clearBucket(BaiduBCS baiduBCS, String bucket)
{
/* 有内容时不允许删除bucket */
// baiduBCS.deleteBucket(bucket);
// CreateBucketRequest request = new CreateBucketRequest(bucket);
// baiduBCS.createBucket(request);
/* 获取存储池内容逐项删除 */
ListObjectRequest listObjectRequest = new ListObjectRequest(bucket);
BaiduBCSResponse response = baiduBCS.listObject(listObjectRequest);
for (ObjectSummary os : response.getResult().getObjectSummaries())
{
System.out.println("Delete: bucket = " bucket "file = " os.toString());
baiduBCS.deleteObject(bucket, os.getName());
}
}
/**
* 获取BCS将目录下的所有文件下载到本地
* @param baiduBCS
* @param localDir :指定将文件保存到本地的路径
* @param serverDir: BCS文件路径在服务器上
*/
private static void getFilesByDir(BaiduBCS baiduBCS, String localDir, String serverDir)
{
ListObjectRequest listObjectRequest = new ListObjectRequest(bucket);
listObjectRequest.setStart(0);
listObjectRequest.setLimit(20);
listObjectRequest.setPrefix(serverDir);
// ------------------by dir
{
// prefix must start with '/' and end with '/'
// listObjectRequest.setPrefix("/1/");
// listObjectRequest.setListModel(2);
}
// ------------------only object
{
// prefix must start with '/'
// listObjectRequest.setPrefix("/1/");
}
BaiduBCSResponse response = baiduBCS.listObject(listObjectRequest);
//log.info("we get [" response.getResult().getObjectSummaries().size() "] object record.");
for (ObjectSummary os : response.getRsult().getObjectSummaries()) {
System.out.println("Download : " + os.toString());
GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, os.getName());
File file = new File(localDir + getFileName(os.getName()));
baiduBCS.getObject(getObjectRequest, file);
}
}
/**
* 将本地路径下的文件上传到BCS服务器上,过滤本地隐藏文件
* @param baiduBCS
* @param localDir
* @param serverDir
*/
private static void putFilesByDir(BaiduBCS baiduBCS, String localDir, String serverDir)
{
File file = new File(localDir);
int count = 1;
if(!file.isDirectory())
{
putObjectByFile(baiduBCS, file, serverDir);
}
else
{
while(count < 100000) /* 这层循环仅用于测试BCS存储池最大可存储多少数据 */
{
String[] list = file.list();
for(int i = 0; i < list.length; i++)
{
File subFile = new File(localDir + "\\" + list[i]);
/* 过滤隐藏文件 */
if(subFile.isHidden())
{
continue;
}
putObjectByFile(baiduBCS, subFile, serverDir);
}
count++;
}
}
}
private static String getFileName(String fullName)
{
String[] strs = fullName.split("/");
return strs[strs.length - 1];
}
}