本项目选用阿里云的OSS服务进行文件存储
一、阿里oss服务准备(如已开通oss服务,可跳过)
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。即一个用于存储文件的云服务器。
(1)进入阿里云官网,搜索oss,进入oss,如未开通会有开通服务按钮,开通成功后,如下图:
(2)接着创建Bucket,点击创建Bucket按钮,会弹出如下界面,只需输入Bucket名称,地域自己选择,我选择的华东1(杭州),修改读写权限为公共读(使前端可以获取图片,从而回显)
![](https://img-blog.csdnimg.cn/direct/1bacf02b4c3a4e06aa02d440521885d4.png)
(3)鼠标放在我主账号头像上,会弹出如下信息,点击AccessKey管理,进入后点击创建AccessKey,记住AccessKey ID和AccessKey Secret(注意:只有创建时才有,注意保存)
(4)在阿里提供的文档里可以找到如何结合代码使用oss,可以根据需求复制代码修改(可找到上次文件方法)
(5)查找Endpoint(地域节点),每个地域都不同
(6)第一次使用oss服务,阿里云会免费赠送3个月,如下:每月可接受请求20万次,每月可下载oss服务内容2GB,存储文件大小为20GB![](https://img-blog.csdnimg.cn/direct/3312e0440ce14e7789e0dc08f0a4371a.png)
二、springboot实现阿里云oss对象存储图片上传和回显
1.首先在yml文件中配置好阿里云oss配置
sky:
alioss:
#阿里oss选择的Endpoint(地域节点)
endpoint:
#创建AccessKey时记住的AccessKey ID
access-key-id: access-key-id
#创建AccessKey时记住的AccessKey Secret
access-key-secret: access-key-secret
#创建bucket时自定义的bucket姓名
bucket-name: bucket姓名
2.创建配置类读取oss配置
package com.sky.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 阿里oss配置类,用于读取配置文件的配置
*/
@Component
@Data
@ConfigurationProperties(prefix = "sky.alioss")
public class AliOssProperties {
public String endpoint;
public String accesskeyid;
public String accesskeysecret;
public String bucketName;
}
3.新建一个oss工具类,在里面编写上传文件方法(上传文件方法copy阿里云上传文件sdk文档)
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/**
* 文件上传
*
* @param bytes
* @param objectName
* @return
*/
public String upload(byte[] bytes, String objectName) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObject请求。
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
//文件访问路径规则 https://BucketName.Endpoint/ObjectName
StringBuilder stringBuilder = new StringBuilder("https://");
stringBuilder
.append(bucketName)
.append(".")
.append(endpoint)
.append("/")
.append(objectName);
log.info("文件上传到:{}", stringBuilder.toString());
//返回一个文件路径字符串,从而使得前端可以回显
return stringBuilder.toString();
}
}
4.新建一个配置类,用于启动项目时自动生成oss工具类
import com.sky.properties.AliOssProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
public class OssCreateConfiguration {
/**
* 创建AliOssUtil对象
* @return
*/
@Bean
//保证只有一个aliOssUtilCreate的bean对象
@ConditionalOnMissingBean
public AliOssUtil aliOssUtilCreate(AliOssProperties aliOssProperties){
log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
return new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
}
}
5.在controller层使用AliOssUtil类的upload方法,上传文件到阿里云
import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;
@RestController
@Slf4j
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
public class CommonController {
@Autowired
private AliOssUtil aliOssUtil;
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file){
log.info("文件上传");
//获取上传的文件的原始名称
String originalFilename = file.getOriginalFilename();
//获取上传的文件的后缀名,例如asd.png的.png后缀
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//根据uuid创建新文件名
String fileName = UUID.randomUUID().toString()+substring;
//使用aliOssUtil的upload方法
try {
String uploadPath = aliOssUtil.upload(file.getBytes(), fileName);
//返回文件上传路径
return Result.success(uploadPath);
} catch (IOException e) {
log.info("文件上传失败:{}",e);
// e.printStackTrace();
}
return Result.error(MessageConstant.UPLOAD_FAILED);
}
}
注意:SpringBoot默认上传文件大小不能超过1MB,超过之后会报以下异常:
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException:
The field file exceeds its maximum permitted size of 1048576 bytes.
解决办法:
在配置文件(application.properties/application.yml)中加入如下设置:
#Spring Boot 1.3 或之前的版本,配置:
multipart.maxFileSize = 100Mb
multipart.maxRequestSize=150Mb
#Spring Boot 1.4 版本后配置更改为:
spring.http.multipart.maxFileSize = 100Mb
spring.http.multipart.maxRequestSize = 150Mb
#Spring Boot 2.0 之后的版本配置修改为: 单位Mb改为MB了
spring.servlet.multipart.max-file-size = 100MB
spring.servlet.multipart.max-request-size = 150MB