# Android SDK

# 源码

请从GitHub获取源码,https://github.com/SinaCloudStorage/SinaStorage-SDK-Android

# 概述

新浪云存储Android平台SDK为第三方应用提供了简单易用的API调用服务,使第三方客户端无需了解复杂的验证机制即可进行授权、上传、下载等文件操作。您可以通过 Maven 进行构建本项目。

# SDK环境要求

依赖库

  • google-gson-2.2.4

# 创建bucket访问对象

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

/**
 * 获取所有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 操作

# 获取文件信息

/**
 * 获取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

/* 生成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);
}