阿里巴巴OSS对象存储在java中使用
阿里0ss简介
阿里云OSS(Object Storage Service,对象存储服务)是一种高可用、高可靠、海量、安全的云存储服务,可以帮助用户存储和管理海量非结构化数据,如图片、音频、视频等。
阿里云OSS提供了简单易用的API,可以方便地上传、下载、管理和分享数据。它还提供了多种数据存储类型和数据访问方式,以满足不同场景下的需求,如标准存储、低频访问存储、归档存储等。
阿里云OSS还具有高可用性和高可靠性,它采用了多副本存储和多机房容灾技术,确保数据的安全性和可用性。此外,阿里云OSS还提供了多种安全措施,如访问控制、数据加密等,保障用户数据的安全。
因此,阿里云OSS广泛应用于各种场景,如网站图片、视频、音频存储、备份和归档、大数据分析等。
使用背景
在进行电商后台上传图片,并且需要存储到数据库中,这里我们想到使用阿里oss云端存储,数据库只需要存储经过oss处理后返回给我们的图片的链接。
1.首先创建所需文件
注意:这里是创建的maven项目,手动改造成springboot项目。
2.pom文件以及applicat.yml等配置文件
这里我只放最主要的,其他的一些数据库相关,springboot相关pom配置这里就不列举了
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
server:
port: 8081
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///db_cloudgp
username: ****
password: *******
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
3.实体层
@Data
@TableName("t_alioss")
@NoArgsConstructor
public class Alioss {
//序号,主键
@TableId(type = IdType.AUTO)
private Integer id;
//存储空间名称
private String bucket;
//对象名
private String objname;
//类型:1.图片 2.视频
private Integer type;
//创建时间
private Date ctime;
//访问地址
private String url;
//访问地址的结束时间
private Date etime;
public Alioss(String bucket, String objname, Integer type, String url, Date etime) {
this.bucket = bucket;
this.objname = objname;
this.type = type;
this.url = url;
this.etime = etime;
}
}
这里需要按照实体层字段手动创建数据库。
4.第三方工具包
阿里oss工具代码封装
public class AliOssUtil {
private static final String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 进入阿里oss获取产品key值
private static final String accessKeyId = "L**********czMQ";
// key值对应密码
private static final String accessKeySecret = "K1*************uChXoj8";
// 存储上传文件的容器
public static final String BUCKET="**********";
private static OSS client;
static {
client = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
}
/**
* 创建储存空间名称
* @param name 创建存储空间名称
* @return
*/
public static boolean create(String name) {
CreateBucketRequest createBucketRequest = new CreateBucketRequest(name);
Bucket bucket = client.createBucket(createBucketRequest);
return bucket!=null;
}
/**
* 实现文件上传
* @param bucket 存储空间名称
* @param obj 存储对象名称,带文件后缀
* @param data 文件内容
* @return
*/
public static boolean upload(String bucket,String obj, byte[] data) {
PutObjectRequest request = new PutObjectRequest(bucket, obj, new ByteArrayInputStream(data));
request.setProcess("true");
PutObjectResult result=client.putObject(request);
return result.getResponse().getStatusCode()==200;
}
/**
* 创建访问链接
* @param bucket 存储空间名称
* @param obj 存储对象名称,带文件名后缀
* @param etime 访问地址的失效时间
* @return 访问地址
*/
public static String createUrl(String bucket, String obj,Date etime){
return client.generatePresignedUrl(bucket, obj, etime).toString();
}
/**
* 删除文件
* @param bucket 存储空间名称
* @param obj 存储对象名称,带文件后缀
*/
public static void deFile(String bucket,String obj){
client.deleteObject(bucket, obj);
}
这里需要自己扫码登陆,新人用户可以免费使用三个月,创建key需要实名认证。
文件名处理工具封装
public class FileUtil {
/**
* 实现文件名的重命名和限长*/
public static String rename(String fn){
if(fn.length()>50){
fn=fn.substring(fn.length()-50);
}
return System.currentTimeMillis()+"-"+new Random().nextInt(10000)+fn;
}
}
5.Dao层
public interface AliossDao extends BaseMapper<Alioss> {
}
这里继承了mybatis-plus。
6.service层
接口
public interface AliossService {
/**
* 上传图片*/
R uploadImg(MultipartFile file);
/**
* 查询全部*/
R all();
}
实现类
public class AliossServiceImpl implements AliossService {
@Resource
private AliossDao dao;
@Override
public R uploadImg(MultipartFile file) {
//1.验证
if(!file.isEmpty()){
//2.获取文件名
String fn= FileUtil.rename(file.getOriginalFilename());
try {
if(AliOssUtil.upload(AliOssUtil.BUCKET,fn,file.getBytes())){
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.YEAR,3);
Date date=calendar.getTime();
String url=AliOssUtil.createUrl(AliOssUtil.BUCKET,fn,date);
dao.insert(new Alioss(AliOssUtil.BUCKET,fn,1,url,date));
return R.ok(url);
}
} catch (IOException e) {
e.printStackTrace();
}
}
return R.fail();
}
@Override
public R all() {
return R.ok(dao.selectList(null));
}
}
7.controller层
@RestController
public class AliOssController {
@Resource
private AliossService service;
@PostMapping("/server/oss/uploadimg")
public R uploadImg(MultipartFile file){
return service.uploadImg(file);
}
@GetMapping("/server/oss/all")
public R all(){
return service.all();
}
}
8.swagger接口文档测试
文件配置文成后,可以经行swagger接口测试
如图就是我们上传文件成功后生成的链接。注意:接口请求我使用了nacos,接口请求会有所不同。
9.碰到的问题以及解决
1.我碰到报错有,文件上传大小超出1MB,报错信息有byte10245什么的就是这个问题
解决:只需在yml文件中配置文件大小即可
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
2.错误信息:
ERROR 16388 --- [nio-8081-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.aliyun.oss.OSSException: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
解决:通过GPT得到答案
这是一个OSS(Object Storage Service,对象存储服务)的错误信息,提示你访问的存储桶(bucket)需要使用指定的端点(endpoint)进行访问。你需要将所有未来的请求发送到指定的端点,而不是当前的端点。
具体来说,你需要将请求的终端(endpoint)更改为“oss-cn-beijing.aliyuncs.com”,而不是当前的“keyword-hero.oss-cn-hangzhou.aliyuncs.com”。这可以通过更改请求的URL或配置文件中的配置来完成。
10.总结
t.
解决:通过GPT得到答案
这是一个OSS(Object Storage Service,对象存储服务)的错误信息,提示你访问的存储桶(bucket)需要使用指定的端点(endpoint)进行访问。你需要将所有未来的请求发送到指定的端点,而不是当前的端点。
具体来说,你需要将请求的终端(endpoint)更改为“oss-cn-beijing.aliyuncs.com”,而不是当前的“keyword-hero.oss-cn-hangzhou.aliyuncs.com”。这可以通过更改请求的URL或配置文件中的配置来完成。
##### 10.总结
这是java种使用第三方工具,类似的第三方还有短信服务,第三方支付等,大致思路都是导入依赖,配置yml,配置工具包,按照业务需求进行调用。