介绍
对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。
参考文档
准备工作
首先登录阿里云账号
到控制台里选择对象存储OSS,开通oss,注意此服务会根据流量收取费用
安装
进行OSS各类操作前,您需要先安装Java SDK。本文提供了Java SDK的多种安装方式,请结合实际使用场景选用。
前提条件
使用Java 1.7及以上版本。
您可以通过命令java -version查看Java版本。
安装SDK
您可以通过以下三种方式安装SDK。
- 方式一:在Maven项目中加入依赖项(推荐方式)
在Maven工程中使用OSS Java SDK,只需在pom.xml中加入相应依赖即可。以3.10.2版本为例,在中加入如下内容:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
- 方式二:在Eclipse项目中导入JAR包
以3.10.2版本为例,步骤如下:
- 下载Java SDK 开发包。
- 解压该开发包。
- 将解压后文件夹中的文件aliyun-sdk-oss-3.10.2.jar以及lib文件夹下的所有文件拷贝到您的项目中。
- 在Eclipse中选择您的工程,右键选择Properties > Java Build Path > Add JARs。
- 选中拷贝的所有JAR文件,导入到Libraries中。
- 方式三:在Intellij IDEA项目中导入JAR包
以3.10.2版本为例,步骤如下:
- 下载Java SDK 开发包。
- 解压该开发包。
- 将解压后文件夹中的文件aliyun-sdk-oss-3.10.2.jar以及lib文件夹下的所有JAR文件拷贝到您的项目中。
- 在Intellij IDEA中选择您的工程,右键选择File > Project Structure > Modules > Dependencies > + > JARs or directories 。
- 选中拷贝的所有JAR文件,导入到External Libraries中。
初始化
OSSClient是OSS的Java客户端,用于管理存储空间和文件等OSS资源。使用Java SDK发起OSS请求,您需要初始化一个OSSClient实例,并根据需要修改ClientConfiguration的默认配置项。
新建OSSClient
@Data
@ConfigurationProperties(prefix = "quanmingyanxuan.aliyun-oss")
public class OSSClientConstants {
//阿里云API的外网域名
private String endPoint;
//阿里云API的密钥Access Key ID
private String accessKeyId;
//阿里云API的密钥Access Key Secret
private String accessKeySecret;
//阿里云OSS文件夹
private String backetName;
// 文件名
private String folder;
}
您的工程中可以有一个或多个OSSClient。OSSClient可以并发使用。
实现
配置数据
这里需要指定Endpoint。有关Endpoint的更多信息,按照你开通oss服务的配置就行了
oss:
endpoint: oss-cn-xxxxx.aliyuncs.com
keyid: LTAI4GAeifxxxxxxxxAE8KpV
keysecret: wRpsOkDEwKzmxxxxxxxxEP8qUJji
bucketname: xxx-test # bucket名称
filehost: xxx-test
domainname: http://xxx.com.cn
配置文件(公共配置)
@Configuration
@Data
public class CommonConfig {
@Value("${file.dir}")
private String fileDir;
@Value("${message.push-url}")
private String messagePushUrl;
@Value("${jpush.app-key:6ba985e9c1b1a614d917341b}")
private String jPushAppKey;
@Value("${jpush.master-secret:c1d5b6cb445650ed56b5194a}")
private String jPushMasterSecret;
实现类(工具类)
/**
* 阿里云OSS工具类
*/
@Service
@Slf4j
@AllArgsConstructor
public class AliyunOSSUtil {
private final ConstantProperties constantProperties;
private final BladeLogger bladeLogger;
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
private final CommonConfig commonConfig;
/**
* 上传
*
* @param file file
* @param path 文件路径,不包含后缀
* @return 文件访问URL
*/
public String upload(File file, String path) {
if (null == file) {
return null;
}
log.info("=========>OSS文件上传开始:" + file.getName());
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
String bucketName = constantProperties.getBucketname();
String fileHost = constantProperties.getFilehost();
String domainName = constantProperties.getDomainname();
log.info(endpoint + "endpoint");
if (StrUtil.isBlank(path)) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
path = format.format(new Date());
}
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
//容器不存在,就创建
if (!ossClient.doesBucketExist(bucketName)) {
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
//创建文件路径
String fileUrl =
fileHost + CommonConstant.SEPARATOR_LINUX + (path + CommonConstant.SEPARATOR_LINUX + file.getName());
fileUrl = StrUtil.replace(fileUrl, "//", "/");
//上传文件
PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
//设置权限 这里是公开读
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
if (null != result) {
log.info("==========>OSS文件上传成功,OSS地址:" + fileUrl);
// return bucketName+"."+endpoint+"/"+fileUrl;
return domainName + CommonConstant.SEPARATOR_LINUX + fileUrl;
}
} catch (OSSException oe) {
log.error(oe.getMessage());
} catch (ClientException ce) {
log.error(ce.getMessage());
} finally {
//关闭
ossClient.shutdown();
}
return null;
}
/**
* 删除
*
* @param fileKey
* @return
*/
public String deleteBlog(String fileKey) {
log.info("=========>OSS文件删除开始");
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
String bucketName = constantProperties.getBucketname();
try {
@SuppressWarnings("deprecation")
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
if (!ossClient.doesBucketExist(bucketName)) {
log.info("==============>您的Bucket不存在");
return "您的Bucket不存在";
} else {
log.info("==============>开始删除Object");
ossClient.deleteObject(bucketName, fileKey);
log.info("==============>Object删除成功:" + fileKey);
return "==============>Object删除成功:" + fileKey;
}
} catch (Exception ex) {
log.info("删除Object失败", ex);
return "删除Object失败";
}
}
/**
* 查询文件名列表
*
* @param bucketName
* @return
*/
public List<String> getObjectList(String bucketName) {
List<String> listRe = new ArrayList<>();
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
try {
log.info("【阿里云OSS】查询文件名列表");
@SuppressWarnings("deprecation")
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
//列出11111目录下今天所有文件
listObjectsRequest.setPrefix("11111/" + format.format(new Date()) + CommonConstant.SEPARATOR_LINUX);
ObjectListing list = ossClient.listObjects(listObjectsRequest);
for (OSSObjectSummary objectSummary : list.getObjectSummaries()) {
log.info(objectSummary.getKey());
listRe.add(objectSummary.getKey());
}
return listRe;
} catch (Exception ex) {
log.info("【阿里云OSS】查询列表失败", ex);
return new ArrayList<>();
}
}
/**
* 下载文件
*
* @param objectName oss对象存储完整文件名
*/
public void download(String objectName) {
OSS oss = null;
try {
String absolutePath = StrUtil.concat(false, commonConfig.getFileDir(),
StrUtil.removePrefix(objectName, constantProperties.getFilehost()));
if (!CommonConstant.SYS_SEPARATOR.equals(CommonConstant.SEPARATOR_LINUX)) {
absolutePath = StrUtil.replace(absolutePath, CommonConstant.SEPARATOR_LINUX, CommonConstant.SYS_SEPARATOR);
}
absolutePath = PathUtil.removeRepeatSeparator(absolutePath);
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
String bucketName = constantProperties.getBucketname();
objectName = PathUtil.removeRepeatSeparator(objectName);
oss = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
FileUtil.mkParentDirs(absolutePath);
oss.getObject(new GetObjectRequest(bucketName, objectName), FileUtil.newFile(absolutePath));
} catch (Exception e) {
bladeLogger.error(CommonConstant.LOG_ID_COMMON, "下载OSS文件失败." + e.getMessage());
throw new ServiceException(BladeResultCode.DOWNLOAD_OSS_FILE_FAIL, e);
} finally {
oss.shutdown();
}
}
/**
* 判断文件是否存在
*
* @param objectName
* @return
*/
public boolean checkExist(String objectName) {
OSS oss = null;
try {
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
String bucketName = constantProperties.getBucketname();
objectName = PathUtil.removeRepeatSeparator(objectName);
oss = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
return oss.doesObjectExist(new GenericRequest(bucketName, objectName));
} catch (Exception e) {
bladeLogger.error(CommonConstant.LOG_ID_COMMON, "检查OSS文件是否存在失败." + e.getMessage());
throw new ServiceException(BladeResultCode.DOWNLOAD_OSS_FILE_FAIL, e);
} finally {
oss.shutdown();
}
}
}
以上代码全是可复制粘贴即可使用的