版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loy_184548/article/details/81907973
网易云对象存储使用笔记
官方文档:here
实际上官方文档写的已经很清楚了,这里再简单记录一下,需要注意的是:
- 网易云桶中文件名(key值) 需要文件后缀,如果不带文件后缀,文件下载无法打开
一、网易云对象存储
网易对象存储为用户提供基于互联网的数据存取服务,通过使用 NOS,用户可以随时通过网络将文本、图片、音视频等各类文件存储到 NOS 系统中,并随时可以通过网络进行安全访问
1. 概念
- 桶: NOS 的对象容器,所有的对象必须放入桶中,桶名称 NOS 全局唯一,桶内Key唯一
- key:每个对象拥有桶内唯一的 key,类比于文件名,key 由用户自定义,对象 存取接口通过 key 来操作
2. 初始化
a. MAVEN
<dependency>
<groupId>com.netease.cloud</groupId>
<artifactId>nos-sdk-java-publiccloud</artifactId>
<version>0.0.4</version>
</dependency>
b. 获取密钥对
注册账户,获取ACCESS_KEY以及SECRET_KEY
c. 实例化 NosClient
// 初始化
Credentials credentials = new BasicCredentials(ACCESS_KEY, SECRET_KEY);
NosClient nosClient = new NosClient(credentials);
// 初始化TransferManager
TransferManager transferManager = new TransferManager(nosClient);
3. 桶管理
a. 创建桶
注意桶的权限:
- 私有:读写桶内资源需要通过认证
- 公开:所有人均可访问该桶资源,但是写数据仍然需要通过认证
// createBucket
// 入参 bucketName 桶名
// 桶名为全局唯一,需先判断桶名是否已经存在
boolean exists = nosClient.doesBucketExist(bucketName);
if (exists == true){
baseResult.returnWithoutValue(Code.BUCKET_EXIST);
return baseResult;
}
//设置你要创建桶的名称
CreateBucketRequest request = new CreateBucketRequest(bucketName);
//设置桶的权限,如果不设置,默认为Private
request.setCannedAcl(CannedAccessControlList.PublicRead);
nosClient.createBucket(request);
b. 列举桶
ArrayList bucketList = new ArrayList();
for (Bucket bucket : nosClient.listBuckets()) {
bucketList.add(bucket.getName());
}
c. 删除桶
nosClient.deleteBucket(bucketName);
4. 文件管理
a. 上传文件
方式一: 通过MultipartFile上传文件
// 先判断文件是否已经存在,如果已经存在再次上传会覆盖原来的文件
// 将MultipartFile转为File
File file = changeFile(multipartFile);
InputStream inputStream = new FileInputStream(file);
//流式上传文件
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(file.length());
objectMetadata.setContentType(multipartFile.getContentType());
Upload upload = transferManager.upload(bucketName, objectName, inputStream, objectMetadata);
UploadResult result = upload.waitForUploadResult();
//如果不需要File文件可删除
if (file.exists()) { file.delete(); }
// 转换文件方法
private File changeFile(MultipartFile multipartFile) {
// 获取文件名
String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// todo 修改临时文件文件名
File file = File.createTempFile(fileName, prefix);
// MultipartFile to File
multipartFile.transferTo(file);
return file;
}
方式二:通过实际路径上传文件
nosClient.putObject(bucketName,objectName, new File(url));
b. 获取文件URL
// OVERDUE_DATE = 3600 * 1000 * 24 * 365;
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
//设置可下载URL的过期时间,默认过期时间为1天
generatePresignedUrlRequest.setExpiration(new Date(System.currentTimeMillis() + OVERDUE_DATE));
URL url = nosClient.generatePresignedUrl(generatePresignedUrlRequest);
c. 删除文件
nosClient.deleteObject(bucketName,objectName);
d. 获取文件列表
// 根据桶名获取桶内文件列表
ObjectListing objectListing = nosClient.listObjects(bucketName);
List<NOSObjectSummary> sums = objectListing.getObjectSummaries();
e. 重命名文件
nosClient.moveObject(bucketName, oldName, bucketName, newName);