为方便开发者使用云存储服务进行开发,我们提供了多语言的云存储服务相关的SDK、shell-tool及curl等工具
Android SDK For 新浪云存储
新浪云存储Android平台SDK为第三方应用提供了简单易用的API调用服务,使第三方客户端无需了解复杂的验证机制即可进行授权、上传、下载等文件操作。您可以通过Maven进行构建本项目。
本文档详细内容请查阅:SinaStorage’s documentation
依赖库:
import com.sina.cloudstorage.auth.AWSCrentials;
import com.sina.cloudstorage.auth.BasicAWSCredentials;
import com.sina.cloudstorage.services.scs.SCS;
import com.sina.cloudstorage.services.scs.SCSClient;
String accessKey = "你的accessKey";
String secretKey = "你的secretKey";
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
SCS conn = new SCSClient(credentials);
列出所有bucket:
/**
* 获取所有bucket
*/
public void getAllBuckets(){
List<Bucket> list = conn.listBuckets();
System.out.println("====getAllBuckets===="+list);
}
创建bucket:
/**
* 创建bucket
*/
public void createBucket(){
Bucket bucket = conn.createBucket("bucket-name");
System.out.println(bucket);
}
删除bucket:
/**
* 删除bucket
*/
public void deleteBucket(){
conn.deleteBucket("create-a-bucket");
}
获取bucket ACL:
/**
* 获取bucket ACL
*/
public void getBucketAcl(){
AccessControlList acl = conn.getBucketAcl("create-a-bucket");
System.out.println(acl);
}
设置bucket ACL:
/**
* 设置bucket acl
*/
public void putBucketAcl(){
AccessControlList acl = new AccessControlList();
acl.grantPermissions(UserIdGrantee.CANONICAL, Permission.Read, Permission.ReadAcp);
acl.grantPermissions(UserIdGrantee.ANONYMOUSE,
Permission.ReadAcp,
Permission.Write,
Permission.WriteAcp);
acl.grantPermissions(new UserIdGrantee("UserId"),
Permission.Read,
Permission.ReadAcp,
Permission.Write,
Permission.WriteAcp);
conn.setBucketAcl("create-a-bucket", acl);
}
列bucket中所有文件: /** * 列bucket中所有文件 */ public void listObjects(){ ObjectListing objectListing = conn.listObjects("test"); System.out.println(objectListing); }
获取文件信息:
/**
* 获取object metadata
*/
public void getObjectMeta(){
ObjectMetadata objectMetadata = conn.getObjectMetadata("bucket-name", "/test/file.txt");
System.out.println(objectMetadata.getUserMetadata());
System.out.println(objectMetadata.getContentLength());
System.out.println(objectMetadata.getRawMetadata());
System.out.println(objectMetadata.getETag());
}
下载文件:
/**
* 下载object
* //断点续传
* GetObjectRequest rangeObjectRequest = new GetObjectRequest("test11", "/test/file.txt");
* rangeObjectRequest.setRange(0, 10); // retrieve 1st 10 bytes.
* S3Object objectPortion = conn.getObject(rangeObjectRequest);
*
* InputStream objectData = objectPortion.getObjectContent();
* // "Process the objectData stream.
* objectData.close();
*/
public void getObject(){
//SDKGlobalConfiguration.setGlobalTimeOffset(-60*5);//自定义全局超时时间5分钟以后(可选项)
S3Object s3Obj = conn.getObject("test11", "/test/file.txt");
InputStream in = s3Obj.getObjectContent();
byte[] buf = new byte[1024];
OutputStream out = null;
try {
out = new FileOutputStream(new File("dage1.txt"));
int count;
while( (count = in.read(buf)) != -1)
{
if( Thread.interrupted() )
{
throw new InterruptedException();
}
out.write(buf, 0, count);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
//SDKGlobalConfiguration.setGlobalTimeOffset(0);//还原超时时间
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上传文件:
/**
* 上传文件
*/
public void putObject(){
PutObjectResult putObjectResult = conn.putObject("bucket名称",
"文件上传路径",
new File("本地文件"));
System.out.println(putObjectResult);
}
上传文件(自定义请求头):
/**
* 上传文件 自定义请求头
*/
public void putObjectWithCustomRequestHeader(){
//自定义请求头k-v
Map<String, String> requestHeader = new HashMap<String, String>();
requestHeader.put("x-sina-additional-indexed-key", "stream/test111.txt");
PutObjectResult putObjectResult = conn.putObject("bucket名称", "ssk/a/",
new File("本地文件"), requestHeader);
System.out.println(putObjectResult);//服务器响应结果
}
秒传文件:
/**
* 秒传
*/
public void putObjectRelax(){
conn.putObjectRelax("bucket名称","文件上传路径","被秒传文件的sina_sha1值",被秒传文件的长度);
}
复制文件:
/**
* 拷贝object
*/
public void copyObject(){
conn.copyObject("源bucket名称", "源文件路径", "目标bucket名称", "目标文件路径");
}
修改文件meta信息:
/**
* 设置object metadata
*/
@SuppressWarnings("serial")
public void putObjectMeta(){
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setUserMetadata(new HashMap<String,String>(){{
put("aaa","1111");
put("bbb","222");
put("ccc","3333");
put("asdfdsaf","vvvvvv");
}});
conn.setObjectMetadata("bucket名称", "文件路径", objectMetadata);
}
删除文件:
/**
* 删除Object
*/
public void deleteObject(){
conn.deleteObject("bucket名称", "文件路径");
}
获取文件acl信息:
/**
* 获取object acl
*/
public void getObjectAcl(){
AccessControlList acl = conn.getObjectAcl("bucket名称", "文件路径");
System.out.println(acl);
}
修改文件acl信息:
/**
* 设置object acl
*/
public void putObjectAcl(){
AccessControlList acl = new AccessControlList();
acl.grantPermissions(UserIdGrantee.CANONICAL, Permission.Read,Permission.ReadAcp);
acl.grantPermissions(UserIdGrantee.ANONYMOUSE,Permission.ReadAcp,Permission.Write,Permission.WriteAcp);
acl.grantPermissions(new UserIdGrantee("UserId"), Permission.Read,Permission.ReadAcp,Permission.Write,Permission.WriteAcp);
conn.setObjectAcl("bucket名称", "文件路径", acl);
}
分片上传文件:
/**
* 分片上传文件
* @throws Exception
*/
public void multipartsUpload() throws Exception{
//初始化上传任务
InitiateMultipartUploadResult initiateMultipartUploadResult = conn.initiateMultipartUpload("bucket名称", "文件路径");
if(initiateMultipartUploadResult!=null){
//分片上传
List<PartETag> partETags = null;
PutObjectRequest putObjectRequest = new PutObjectRequest(initiateMultipartUploadResult.getBucketName(),
initiateMultipartUploadResult.getKey(), new File("本地待上传文件"));
try {
long optimalPartSize = 5 * 1024 * 1024; //分片大小5M
UploadPartRequestFactory requestFactory = new UploadPartRequestFactory(putObjectRequest, initiateMultipartUploadResult.getUploadId()
, optimalPartSize);
partETags = uploadPartsInSeries(requestFactory);
} catch (Exception e) {
throw e;
} finally {
if (putObjectRequest.getInputStream() != null) {
try {
putObjectRequest.getInputStream().close();
} catch (Exception e) {
throw e;
}
}
}
//分片列表
PartListing partList = conn.listParts(new ListPartsRequest(initiateMultipartUploadResult.getBucketName(),
initiateMultipartUploadResult.getKey(),
initiateMultipartUploadResult.getUploadId()));
System.out.println("已上传的文件分片列表:\n"+partList);
//分片合并,完成上传
ObjectMetadata objectMetadata = conn.completeMultipartUpload(new CompleteMultipartUploadRequest(putObjectRequest.getBucketName(),
putObjectRequest.getKey(), initiateMultipartUploadResult.getUploadId(), partETags));
System.out.println("合并文件结果:\n");
System.out.println(objectMetadata.getUserMetadata());
System.out.println(objectMetadata.getContentLength());
System.out.println(objectMetadata.getRawMetadata());
System.out.println(objectMetadata.getETag());
}
}
高级工具 TransferManager
/* TransferManager */
public void putObjectByTransferManager(){
TransferManager tf = new TransferManager(conn);
Upload myUpload = tf.upload("bucket名称", "文件路径", new File("待上传文件本地路径"));
// You can poll your transfer's status to check its progress
if (myUpload.isDone() == false) {
System.out.println("Transfer: " + myUpload.getDescription());
System.out.println(" - State: " + myUpload.getState());
System.out.println(" - Progress: "
+ myUpload.getProgress().getBytesTransferred());
}
// Transfers also allow you to set a <code>ProgressListener</code> to
// receive
// asynchronous notifications about your transfer's progress.
myUpload.addProgressListener(new ProgressListener(){
@Override
public void progressChanged(ProgressEvent progressEvent) {
System.out.println(progressEvent);
}
});
// Or you can block the current thread and wait for your transfer to
// to complete. If the transfer fails, this method will throw an
// SCSClientException or SCSServiceException detailing the reason.
try {
myUpload.waitForCompletion();
} catch (SCSServiceException e) {
e.printStackTrace();
} catch (SCSClientException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
含签名信息URL:
/* 生成url*/
public void generateUrl(){
Date expiration = new Date(); //过期时间
long epochMillis = expiration.getTime();
epochMillis += 60*5*1000;
expiration = new Date(epochMillis);
URL presignedUrl = conn.generatePresignedUrl("bucket名称", "文件路径", expiration, false);
System.out.println(presignedUrl);
}