Java操作aliyun-OSS对象存储

官网https://www.aliyun.com/product/oss第一句话:
“对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全和高可靠的云存储服务。RESTFul API的平台无关性,容量和处理能力的弹性扩展,按实际容量付费真正使您专注于核心业务。”
当项目在使用的过程中会产生一些文件并需要存储,而自己的服务器容量不足够大来存储这些文件,这个时候就可以选择阿里云的对象存储服务。当然这是我的使用场景,你也可以参考官网的使用场景。
使用前提在“快速入门”里写得有,你需要开通服务并创建资源空间。
使用方法SDK手册中已经写得非常清楚了:https://help.aliyun.com/document_detail/32015.html?spm=5176.doc32013.6.305.MD4X5m
“在OSS中,用户操作的基本数据单元是文件(Object)。OSS Java SDK提供了丰富的文件上传接口,可以通过以下方式上传文件:
1.流式上传
2.文件上传
3.追加上传
4.分片上传
5.断点续传上传”
我采用的是文件上传方式:
需要的jar包

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.2.3</version>
</dependency>

首先你需要一个OSSClient,里面的keyId以及keySecret是你在开通服务的时候获得的;OSS是没有文件夹这个概念的,所有元素都是以Object来存储,代码中的myKey或keys是你上传的Object的完整的键名称,比如你上传到 test/myWord/new.doc 里面,那么你的myKey就是“test/myWord/new.doc”,不管你本地的文件名称是什么,上传到云端之后的对象名称就是你的myKey的名称;OSS允许用户自定义Http header,在上传文件的方法中,设置了上传内容类型以及上传文件长度,之前看到一篇文章,是说这个云服务是按照量来计费的,所以需要告知它你要上传的内容长度,但是如果我不设置长度,貌似也能上传成功,原因还不清楚:

/**
 * OSSClient
 *
 * @author andy
 * @date 2016年8月31日
 */
public class OSSClientUtil {
    // 访问OSS的域名, endpoint以上海为例,其它region请按实际情况填写
    private static String endpoint = "http://oss-cn-shanghai.aliyuncs.com";
    private static String accessKeyId = "<yourAccessKeyId>";
    private static String accessKeySecret = "<yourAccessKeySecret>";
    private static String bucketName = "<yourBucketName>";

    //getter/setter方法略

}

在上传文件的时候,你需要先创建OSSClient实例,然后调用上传文件的方法。


import java.io.File;
import java.io.InputStream;
import java.util.List;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;

/**
 * 从云端上传下载查询删除文件
 *
 * @author andy
 * @date 2016年8月31日
 */
public class FileLoadUtil {

    /**
     * 文件上传
     * 
     * @param myKey
     * @param file 要上传的文件
     */
    public static void upLoadFileToALiyun(String myKey, File file) {
        // 创建OSSClient实例
        OSSClient ossClient = new OSSClient(OSSClientUtil.getEndpoint(), OSSClientUtil.getAccessKeyId(), OSSClientUtil.getAccessKeySecret());
        // 创建上传Object的Metadata
        ObjectMetadata meta = new ObjectMetadata();
        // 设置上传内容类型docx
        meta.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        // 设置上传文件长度
        meta.setContentLength(file.length());
        // 上传文件
        try {
            PutObjectResult m_Result = ossClient.putObject(OSSClientUtil.getBucketName(), myKey, file, meta);
            System.out.println(m_Result.getETag());
        } catch (OSSException oe) {
            oe.printStackTrace();
            throw new OSSException();
        } catch (ClientException ce) {
            ce.printStackTrace();
            throw new ClientException();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();// 关闭client
        }
    }

    /**
     * 文件下载
     * 
     * @param myKey
     * @param tempFileName 要下载的文件名
     * @throws Exception
     */
    public static void downloadFileFromALiyun(String myKey, String tempFileName) throws Exception {
        // 创建OSSClient实例
        OSSClient ossClient = new OSSClient(OSSClientUtil.getEndpoint(), OSSClientUtil.getAccessKeyId(), OSSClientUtil.getAccessKeySecret());
        InputStream inputStream = null;
        // 下载object到文件
        try {
            OSSObject ossObject = ossClient.getObject(new GetObjectRequest(OSSClientUtil.getBucketName(), myKey));
            inputStream = ossObject.getObjectContent();
            String newStr = new String(tempFileName.getBytes(), "UTF-8");
            File f = new File(newStr);
            FileUtil.inputstreamToFile(inputStream, f);
        } catch (OSSException oe) {
            oe.printStackTrace();
            throw new Exception(oe.getErrorMessage());
        } catch (ClientException ce) {
            ce.printStackTrace();
            throw new Exception(ce.getErrorMessage());
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception(e.getMessage());
        } finally {
            ossClient.shutdown();// 关闭client
            FileUtil.closeInputStream(inputStream);
        }
    }

    // 查看Bucket中的Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
    public static void queryObject() {
        // 创建OSSClient实例
        OSSClient ossClient = new OSSClient(OSSClientUtil.getEndpoint(), OSSClientUtil.getAccessKeyId(), OSSClientUtil.getAccessKeySecret());
        try {
            // 要查找的文件
            ObjectListing objectListing = ossClient.listObjects(OSSClientUtil.getBucketName(), "yourObjectKey/");
            List<OSSObjectSummary> objectSummary = objectListing.getObjectSummaries();
            System.out.println("您有以下Object:");
            for (OSSObjectSummary object : objectSummary) {
                System.out.println("\t" + object.getKey());
            }
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();// 关闭client
        }
    }

    // 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
    public static void deleteSingleObect(String myKey) {
        //创建OSSClient实例
        OSSClient ossClient = new OSSClient(OSSClientUtil.getEndpoint(), OSSClientUtil.getAccessKeyId(), OSSClientUtil.getAccessKeySecret());
        try {
            ossClient.deleteObject(OSSClientUtil.getBucketName(), myKey);
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();// 关闭client
        }
    }

    /**
     * 批量删除object
     */
    public static void deleteBatchObect(List<String> keys) {
        // 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
        OSSClient ossClient = new OSSClient(OSSClientUtil.getEndpoint(), OSSClientUtil.getAccessKeyId(), OSSClientUtil.getAccessKeySecret());
        try {
            // 删除Objects
            DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OSSClientUtil.getBucketName()).withKeys(keys));
            List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();// 关闭client
        }
    }

    public static boolean doesObjectExist(String myKey) {
        OSSClient ossClient = new OSSClient(OSSClientUtil.getEndpoint(), OSSClientUtil.getAccessKeyId(), OSSClientUtil.getAccessKeySecret());
        boolean found = false;
        try {
            found = ossClient.doesObjectExist(OSSClientUtil.getBucketName(), myKey);
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();// 关闭client
        }
        return found;
    }

    public static void main(String[] args) {
        // queryObject();
        // deleteBatchObect();
        // System.out.println(doesObjectExist("yourObjectKey/test.doc"));
    }
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值