项目Tips---使用阿里的OOS实现简单的文件上传

2024-03-29 12:18

本文主要是介绍项目Tips---使用阿里的OOS实现简单的文件上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

在还没有工作时,我们做项目时一般使用的Tomcat服务器作为文件上传和下载的存储点。可是作为上线项目这是行不通,所以为了解决海量数据存储与弹性扩容,阿里云给我们提供了一个OOS的对象存储平台。

1. 控制台上操作OOS(工作中较少使用)

前提:必须申请开通OOS服务
[1] 申请阿里云账号 (这里可以通过支付宝一键登录)
[2] 实名认证 (绑定支付宝后,实名十分简单)
[3] 开通“对象存储OOS” 服务
在这里插入图片描述
若是第一次进入是开通 (开通后则会显示管理控制台)
在这里插入图片描述
[4] 进入管理控制台
在这里插入图片描述
[5] 创建Bucket
在这里插入图片描述
在这里插入图片描述

[6] 创建完Bucket后可以自行上传文件
在这里插入图片描述
[7] 上传完文件可以进行详情查看
在这里插入图片描述
通过URL可以下载该图片

[8] 我们可以查看官方文档对该功能进行学习(即通过代码操作上述步骤)
在这里插入图片描述
在这里插入图片描述

2.实现简单的文件上传

[1] 新建一个拥有Web依赖的Boot项目
[2] 在pom.xml引入依赖

<dependencies><!--阿里云oss依赖(必须)--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version></dependency><!--日期工具依赖(非必须)--><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency>
</dependencies>

[3] 编写一个配置文件 application.properties

这里可以通过官方文档直接创建一个实例(不过我们为了变量的复用,使用配置文件的形式)
在这里插入图片描述

#服务端口
server.port=8082
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=  你服务器所在的地址
aliyun.oss.file.keyid=<yourAccessKeyId>
aliyun.oss.file.keysecret=<yourAccessKeySecret>
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=<yourBucketName>

上面关于服务器配置的值可在下面找到:
endpoint 地域节点
在这里插入图片描述

在这里插入图片描述
获取自己的 id和 密钥
在这里插入图片描述
bucketname的话可以自行设置创建的名字
在这里插入图片描述
[4] 若此时直接通过boot启动类开启,则会报错 (若整合了数据库忽略该点)
在这里插入图片描述
在这里插入图片描述
报错原因:
spring boot 会默认加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration这个类,
而DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean,又因为项目中并没有关于dataSource相关的配置信息,所以当spring创建dataSource bean时因缺少相关的信息就会报错。

解决办法:
在@SpringBootApplication注解上加上exclude,解除自动加载DataSourceAutoConfiguration

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

[5] 编写一个读取配置文件的工具类
ConstantPropertiesUtils.class,该类实现InitializingBean 主要是为了让该类在spring托管下,启动时能注入配置文件的值。(作用:注入值)

package com.gs.oss.utils;import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;//当项目自己启动,spring接口,spring加载之后,执行接口的一个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {//读取配置文件内容@Value("${aliyun.oss.file.endpoint}")private String endpoint;@Value("${aliyun.oss.file.keyid}")private String keyId;@Value("${aliyun.oss.file.keysecret}")private String keySecret;@Value("${aliyun.oss.file.bucketname}")private String bucketName;public static String END_POINT;public static String ACCESS_KEY_ID;public static String ACCESS_KEY_SECRET;public static String BUCKET_NAME;@Overridepublic void afterPropertiesSet() throws Exception {END_POINT = endpoint;ACCESS_KEY_ID = keyId;ACCESS_KEY_SECRET = keySecret;BUCKET_NAME = bucketName;}
}

上面的准备步骤是为了变量值的注入(若复用次数相对较少,你完全可以通过定义变量写入即可)
在这里插入图片描述
[5] 编写接口OssService
(若要上传文件一定要使用MultipartFile 类型)

package com.gs.oss.service;import org.springframework.web.multipart.MultipartFile;public interface OssService {//上传头像到osspublic String uploadFileAvatar(MultipartFile file);
}

[6] 编写OssService的实现类
步骤:
<1>读取服务对象的值
<2> 创建OSSClient实例。
<3>获取上传文件的输入流
中间的步骤是为了设置文件名而已
<4> 调用OSSClient的putObject() 方法实现文件上传
<5>关闭OSSClient。
<6> 把上传之后文件路径返回(需要把上传到阿里云的oss路径手动拼接出来,因为每个路径都是有规律的)
例子: https://edu-test10.oss-cn-hangzhou.aliyuncs.com/微信图片_20200717211750.jpg

“https://”+bucketName+"."+endpoint+"/"+filename;
bucketName: 放文件的bucket名,endpoint: 地域节点 , filename: 文件名

package com.gs.oss.service.Impl;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.gs.oss.service.OssService;
import com.gs.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;@Service
public class OssServiceImpl implements OssService {//上传头像到oss@Overridepublic String uploadFileAvatar(MultipartFile file) {// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = ConstantPropertiesUtils.END_POINT;String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;String bucketName = ConstantPropertiesUtils.BUCKET_NAME;try{// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 获取上传文件的输入流InputStream inputStream = file.getInputStream();//获取文件名称String filename = file.getOriginalFilename();//1.在文件名称里添加随机的唯一的值String uuid = UUID.randomUUID().toString().replaceAll("-", "");filename = uuid +"-"+ filename;//2. 获取当前日期(2020/07/19)String datePath = new DateTime().toString("yyyy/MM/dd");//  2020/07/19/ewwqwa01.jpgfilename = datePath+"/"+filename;//调用oss方法实现上传//第一个参数 Bucket名称//第二个参数  上传oss文件路径和文件名称  /aa/bb/1.jpg//第三个参数  上传文件输入流ossClient.putObject(bucketName, filename, inputStream);// 关闭OSSClient。ossClient.shutdown();//把上传之后文件路径返回(需要把上传到阿里云的oss路径手动拼接出来)// https://edu-test10.oss-cn-hangzhou.aliyuncs.com/微信图片_20200717211750.jpgString url = "https://"+bucketName+"."+endpoint+"/"+filename;return url;}catch (Exception e){return null;}}
}

[7] 编写Controller层
其中R表示的是我自定义的数据类型(可以直接返回字符串即可)

package com.gs.oss.controller;import com.gs.commonutils.R;
import com.gs.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin  //这里是为了跨域(可以省略)
public class OssController {@Autowiredprivate OssService ossService;//上传头像的方法@PostMappingpublic R uploadOssFile(MultipartFile file){//获取上传的文件 MultipartFile//返回上传到oss的路径String url =  ossService.uploadFileAvatar(file);return R.ok().data("url",url);}
}

[8] 测试
这里我们如果没有整合Swagger的话,我们可以通过编写一个相应的前端页面(使用表单提交的方式进行测试);这里为了偷懒我直接使用Swagger进行测试接口(相关Swagger的整合可参考:SpringBoot整合Swagger2)
启动项目,并输入:http://localhost:8082/swagger-ui.html
在这里插入图片描述
在这里插入图片描述
选择相应的图片上传后可看到:
在这里插入图片描述
我们可以到OOS的控制台上查看服务端的文件
在这里插入图片描述

这篇关于项目Tips---使用阿里的OOS实现简单的文件上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858571

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注