SpringBoot整合阿里云OSS对象存储服务的实现

网友投稿 411 2022-11-27


SpringBoot整合阿里云OSS对象存储服务的实现

今天来整合一下SpringBoot和阿里云OSS对象存储服务。

一、配置OSS服务

先在阿里云开通对象存储服务,拿到AccessKeyId、AccessKeySecret。

创建你的bucket(存储空间),相当于一个一个的文件夹目录。按业务需求分类存储你的文件,图片,音频,app包等等。创建bucket是要选择该bucket的权限,私有,公共读,公共读写,按需求选择。创建bucket时对应的endpoint要记住,上传文件需要用到。

可以配置bucket的生命周期,比如说某些文件有过期时间的,可以配置一下。

二、代码实现

引入依赖包

com.aliyun.oss

aliyun-sdk-oss

2.8.3

配置文件application.yml

aliyun-oss:

#bucket名称

bucketApp: xxx-app

domainApp: https://xxx-app.oss-cn-shenzhen.aliyuncs.com/

region: oss-cn-shenzhen

endpoint : https://oss-cn-shenzhen.aliyuncs.com

accessKeyId: 你的accessKeyId

accessKeySecret: 你的accessKeySecret

对应上面配置文件的properties类

package com.example.file.config;

import lombok.Data;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

@Component

@ConfigurationProperties(prefix = "aliyun-oss")

@Data

public class AliyunOSSProperties {

/**

* 服务器地点

*/

private String region;

/**

* 服务器地址

*/

private String endpoint;

/**

* OSS身份id

*/

private String accessKeyId;

/**

* 身份密钥

*/

private String accessKeySecret;

/**

* App文件bucketName

*/

private String bucketApp;

/**

* App包文件地址前缀

*/

private String domaWOjsvSOKIinApp;

}

上传文件工具类

package com.example.file.utils;

import com.aliyun.oss.OSSClient;

import com.aliyun.oss.OSSException;

import com.aliyun.oss.model.ObjectMetadata;

import com.aliyun.oss.model.PutObjectResult;

import com.example.common.exception.BusinessErrorCode;

import com.example.common.exception.BusinessException;

import com.example.common.utils.FileIdUtils;

import com.example.file.config.AliyunOSSProperties;

import com.example.file.config.FileTypeEnum;

import org.apache.commons.lang3.StringUtils;

import org.apache.commons.lang3.Validate;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

@Component

public class AliyunOSSUtil {

@Autowired

private AliyunOSSProperties aliyunOSSProperties;

private static Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class);

/**

* 文件不存在

*/

private final String NO_SUCH_KEY = "NoSuchKey";

/**

* 存储空间不存在

*/

private final String NO_SUCH_BUCKET = "NoSuchBucket";

/**

* 上传文件到阿里云 OSS 服务器

*

* @param files

* @param fileTypeEnum

* @param bucketName

* @param storagePath

* @return

*/

public List uploadFile(MultipartFile[] files, FileTypeEnum fileTypeEnum, String bucketName, String storagePath, String prefix) {

//创建OSSClient实例

OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());

List fileIds = new ArrayList<>();

try {

for (MultipartFile file : files) {

//创建一个唯一的文件名,类似于id,就是保存在OSS服务器上文件的文件名(自定义文件名)

String fileName = http://FileIdUtils.creater(fileTypeEnum.getCode());

InputStream inputStream = file.getInputStream();

ObjectMetadata objectMetadata = new ObjectMetadata();

//设置数据流里有多少个字节可以读取

objectMetadata.setContentLength(inputStream.available());

objectMetadata.setCacheControl("no-cache");

objectMetadata.setHeader("Pragma", "no-cache");

objectMetadata.setContentType(file.getContentType());

objectMetadata.setContentDisposition("inline;filename=" + fileNamWOjsvSOKIe);

fileName = StringUtils.isNotBlank(storagePath) ? storagePath + "/" + fileName : fileName;

//上传文件

PutObjectResult result = ossClient.putObject(bucketName, fileName, inputStream, objectMetadata);

logger.info("Aliyun OSS AliyunOSSUtil.uploadFileToAliyunOSS,result:{}", result);

fileIds.add(prefix + fileName);

}

} catch (IOException e) {

logger.error("Aliyun OSS AliyunOSSUtil.uploadFileToAliyunOSS fail,reason:{}", e);

} finally {

ossClient.shutdown();

}

return fileIds;

}

/**

* 删除文件

*

* @param fileName

* @param bucketName

*/

public void deleteFile(String fileName, String bucketName) {

OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());

ossClient.deleteObject(bucketName, fileName);

shutdown(ossClient);

}

/**

* 根据图片全路径删除就图片

*

* @param imgUrl 图片全路径

* @param bucketName 存储路径

*/

public void delImg(String imgUrl, String bucketName) {

if (StringUtils.isBlank(imgUrl)) {

return;

}

//问号

int index = imgUrl.indexOf('?');

if (index != -1) {

imgUrl = imgUrl.substring(0, index);

}

int slashIndex = imgUrl.lastIndexOf('/');

String fileId = imgUrl.substring(slashIndex + 1);

OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());

ossClient.deleteObject(bucketName, fileId);

shutdown(ossClient);

}

/**

* 判断文件是否存在

*

* @param fileName 文件名称

* @param bucketName 文件储存空间名称

* @return true:存在,false:不存在

*/

public boolean doesObjectExist(String fileName, String bucketName) {

Validate.notEmpty(fileName, "fileName can be not empty");

Validate.notEmpty(bucketName, "bucketName can be not empty");

OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoinhttp://t(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());

try {

boolean found = ossClient.doesObjectExist(bucketName, fileName);

return found;

} finally {

shutdown(ossClient);

}

}

/**

* 复制文件

*

* @param fileName 源文件名称

* @param bucketName 源储存空间名称

* @param destinationBucketName 目标储存空间名称

* @param destinationObjectName 目标文件名称

*/

public void ossCopyObject(String fileName, String bucketName, String destinationBucketName, String destinationObjectName) {

Validate.notEmpty(fileName, "fileName can be not empty");

Validate.notEmpty(bucketName, "bucketName can be not empty");

Validate.notEmpty(destinationBucketName, "destinationBucketName can be not empty");

Validate.notEmpty(destinationObjectName, "destinationObjectName can be not empty");

OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());

// 拷贝文件。

try {

ossClient.copyObject(bucketName, fileName, destinationBucketName, destinationObjectName);

} catch (OSSException oe) {

logger.error("errorCode:{},Message:{},requestID:{}", oe.getErrorCode(), oe.getMessage(), oe.getRequestId());

if (oe.getErrorCode().equals(NO_SUCH_KEY)) {

throw new BusinessException(BusinessErrorCode.NO_SUCH_KEY);

} else if (oe.getErrorCode().equals(NO_SUCH_BUCKET)) {

throw new BusinessException(BusinessErrorCode.NO_SUCH_BUCKET);

} else {

throw new BusinessException(BusinessErrorCode.FAIL);

}

} finally {

shutdown(ossClient);

}

}

/**

* 关闭oos

*

* @param ossClient ossClient

*/

private void shutdown(OSSClient ossClient) {

ossClient.shutdown();

}

}

文件类型枚举

package com.example.file.config;

public enum FileTypeEnum {

IMG(1, "图片"),

AUDIO(2, "音频"),

VIDEO(3, "视频"),

APP(4, "App包"),

OTHER(5, "其他");

private Integer code;

private String message;

FileTypeEnum(Integer code, String message) {

this.code = code;

this.message = message;

}

public Integer getCode() {

return code;

}

public String getMessage() {

return message;

}

}

调用工具类上传文件

@Override

public List uploadImg(MultipartFile[] files) {

if (files == null) {

throw new BusinessException(BusinessErrorCode.OPT_UPLOAD_FILE);

}

try {

return aliyunOSSUtil.uploadFile(files, FileTypeEnum.IMG, aliyunOSSProperties.getBucketProduct(), null, aliyunOSSProperties.getDomainProduct());

} catch (Exception e) {

logger.error("uploadImg error e:{}", e);

throw new BusinessException(BusinessErrorCode.UPLOAD_FAIL);

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决阿里代码规范检测中方法缺少javadoc注释的问题
下一篇:解决阿里云OSS使用URL无法访问图片的两种方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~