springboot整合阿里云OSS实现文件上传
平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~
springboot整合阿里云OSS实现文件上传
在电商项目中,PLP、PDP、活动页、商品推荐和订单详情等几乎所有页面都会有访问图片资源的情况。而且PLP和PDP页面访问图片资源的频次更高!将图片保存到本地是一个极其不明智的选择,因为用户访问图片资源会占用大量的流量带宽。通常正确的做法是:将图片资源储存到阿里云oss等类似的云对象存储服务器上。
本文主要讲解springboot项目整合阿里OSS实现图片文件上传的过程。
1 OSS对象存储
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。
2 OSS相关概念
(1)Endpoint:外网访问oss服务器的域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。
(2)Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。
(3)Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件(可以是.png,.txt等任意文件)。
(4)AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。
3 开通并设置阿里OSS
3.1 开通OSS服务
步骤1:登录到阿里云官网;
步骤2:点击下图所示"对象存储OSS"菜单。
3.2 创建存储空间Bucket
点击“创建Bucket”按钮。
按照下图填写bucket名称和相关配置后,点击“确认”保存即可!注意:读写权限应当选择“公共读”,否则上传的文件无法访问!
这样,我们的文件存储空间bucket就创建好了。
3.3 跨域(cros)设置
由于浏览器安全策略,不允许跨域资源访问,所以我们要设置OSS的跨域资源共享。
步骤1:打开上面创建的存储空间nicle-oss-bucket
步骤2:打开权限管理页面,并点击跨域设置的“设置”按钮
打开权限管理页面,并点击跨域设置的“设置”按钮,即可进入跨域规则设置页面!
跨域规则设置页面:
点击“创建规则”按钮,填写跨域配置允许所有域请求(*)!当然这里可以指定域进行访问。
4 创建accessKeyId和accessKeySecret
短信验证后就可以获取到了accessKeyId和accessKeySecret了。
5 代码实现:基于springboot服务端项目调用oss API实现文件上传到oss服务器
项目目录结构如下:
5.1 引进入oss依赖包
<properties>
<aliyun-oss.version>2.5.0</aliyun-oss.version>
</properties>
<!--阿里云oss文件存储服务器依赖包-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun-oss.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
5.2 常量接口类
创建常量接口类:OssConstant.java
/**
* 配置常量
*/
public interface OssConstant {
//外网访问oss服务器的域名
public static final String END_POINT = "oss-cn-beijing.aliyuncs.com";
//访问KEY_ID
public static final String ACCESS_KEY_ID = "LTAIFrerFxxxxxxEwJfNSPoL";
//访问密钥
public static final String ACCESS_KEY_SECRET = "jG46wbefAxxxxxx1OQuyl8MLcuGoO5";
//文件存储空间
public static final String BUCKET = "nicle-oss-bucket";
}
5.3 定义接口返回对象
定义接口返回对象:Result.java
import lombok.Data;
/**
* 接口返回对象
*/
@Data
public class Result<T> {
public static final String DEFAULT_FAILED_CODE = "9998";
public static final String DEFAULT_FAULT_CODE = "9999";
public static final String DEFAULT_SUCCESS_CODE = "0";
/**
* 错误返回时的错误码
*/
private String code;
/**
* 错误返回时的错误信息
*/
private String message;
/**
* status为SC_OK时的JSON字符串
*/
private T data;
/**
* 构造函数(成功返回时使用)
*
* @param object 支持转换JSON格式的Java对象
*/
public Result(T object) {
this.code = DEFAULT_SUCCESS_CODE;
this.message = "";
this.data = object;
}
/**
* 构造函数(失败返回时使用)
*/
public Result(String code, String message) {
this.code = code;
this.message = message;
this.data = null;
}
public static <T> Result<T> ok() {
return new Result<>(null);
}
public static <T> Result<T> ok(T data) {
return new Result<>(data);
}
public static <T> Result<T> failed(String message) {
return new Result<>(DEFAULT_FAILED_CODE, message);
}
public static <T> Result<T> failed(String code, String message) {
return new Result<>(code, message);
}
public static <T> Result<T> fault(String message) {
return new Result<>(DEFAULT_FAULT_CODE, message);
}
public static <T> Result<T> fault(String code, String message) {
return new Result<>(code, message);
}
}
5.4 创建OSS客户端配置类
OSS客户端配置类:OssConfig.java
/**
* OSS客户端配置类
*/
@Configuration
public class OssConfig {
/**
* 定义ossClient bean对象
*/
@Bean
public OSSClient ossClient() {
return new OSSClient(OssConstant.END_POINT, OssConstant.ACCESS_KEY_ID, OssConstant.ACCESS_KEY_SECRET);
}
}
5.5 创建Oss服务接口类
Oss服务接口类:IOssService.java
public interface IOssService {
/**
* 上传图片到OSS服务器
* @return oss服务器图片访问url
*/
String uploadPic();
}
5.6 创建Oss服务接口实现类
Oss服务接口实现类:OssServiceImpl.java
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.entity.ContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@Service
public class OssServiceImpl implements IOssService {
@Autowired
private OSSClient ossClient;
/**
* 上传图片到OSS服务器
*
* @return oss服务器图片访问url
*/
@Override
public String uploadPic() {
String picUrl = "";
try {
//1.从本地读取图片文件
File file = new File("C:\\Users\\jm010426\\Desktop\\1.png");
MultipartFile multipartFile = new MockMultipartFile(file.getName(),
file.getName(),
ContentType.APPLICATION_OCTET_STREAM.toString(),
new FileInputStream(file));
//2.生成oss服务器图片名称(这里用uuid拼接一个name,防止上传图片与其他图片重名而覆盖同名oss文件)
String fileName = UUID.randomUUID().toString().replace("-", "") + "_" + multipartFile.getOriginalFilename();
//3.上传到oss服务器
picUrl = uploadToOss(fileName, new ByteArrayInputStream(multipartFile.getBytes()));
} catch (Exception e) {
log.error("picture upload failed. error:", e);
}
return picUrl;
}
/**
* 上传图片
*
* @param fileName 图片名称,图片名称包括文件夹名称和“/”
* @param in 图片输入流
*/
private String uploadToOss(String fileName, InputStream in) {
// 上传Object.
ossClient.putObject(OssConstant.BUCKET, fileName, in);
//返回oss服务器访问上传图片的url
return "https://" + OssConstant.BUCKET + "." + OssConstant.END_POINT + "/" + fileName;
}
}
5.7 Oss控制器类
Oss控制器类:OssController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Oss控制器
*/
@RestController
@RequestMapping(value = "/oss")
public class OssController {
@Autowired
private IOssService ossService;
/**
* 文件上传到阿里oss服务器
*/
@GetMapping("upload")
public Result<String> upload() {
String picUrl = ossService.uploadPic();
if (StringUtils.isEmpty(picUrl)) {
return Result.failed("上传失败");
}
return Result.ok(picUrl);
}
}
6 测试图片上传
6.1 启动项目
6.2 访问接口上传图片
访问接口:http://localhost:8080/oss/upload
请求方式:get
响应结果:
6.3 访问oss图片链接
6.4 阿里云平台查看oss服务器上的图片文件
如果对你需要帮助或本测试案例源码,关注微信公众号【IT特靠谱】,回复"我要oss项目源码"免费领取吧~
本文地址:https://blog.csdn.net/IT_Most/article/details/109628047