菜鸟踩坑之SpringBoot将Base64格式的图片上传到阿里云OSS
前提提要:之前又发布将文件上传到OSS阿里云。今天前端同事说,前端的图片可能会经过裁剪传递到后端,他会传递过来Base64格式的图片,意味着,我这边后端的接口也要发生变化。
于是,有了今天的踩坑。
依赖:
<!-- 阿里云 对象存储oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.0<</version>
</dependency>
yml文件:
aliyun:
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com # oss对外服务的访问域名
accessKeyId: xxx # 访问身份验证中用到用户标识
accessKeySecret: xxx# 用户用于加密签名字符串和oss用来验证签名字符串的密钥
bucketName: zhuicat-dev # oss的存储空间
Controller层:
@PostMapping("uploadOneFile")
@ApiOperation("修改个人头像")
public CommonResult uploadFile(@RequestBody String file) throws IOException {
//返回上传oss的url
String uploadOneFile = ossUtils.uploadOneFile(file);
// 获取当前登录用户信息
Long userId = SecurityUtils.getUserId();
SysUser sysUser = new SysUser();
sysUser.setId(userId);
sysUser.setAvatar(uploadOneFile);
// 更新数据库信息
sysUserService.updateById(sysUser);
}
OssUtils
@Component
public class OssUtils {
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String secretAccessKey;
@Value("${aliyun.oss.endpoint}")
private String endPoint;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
public String uploadOneFile(String file) throws IOException {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
// 设置文件名
String fileName = new DateTime().toString("yyyy/MM/dd")
+ UUID.randomUUID().toString().replace("-", "");
// 获取文件后缀名
int originalFilenameStartIndex = file.indexOf('/');
int originalFilenameEndIndex = file.indexOf(';');
String originalFilename = file.substring(originalFilenameStartIndex+1,originalFilenameEndIndex);
if (SystemConstants.Picture_Format_JPEG.equals(originalFilename)) {
fileName += ".jpg";
}else if (SystemConstants.Picture_Format_PGN.equals(originalFilename)) {
fileName += ".png";
}else {
throw new ApiException(ErrorEnum.REQUEST_FILE_TYPE_ERROR);
}
// 获取base64的文件
file = file.split(",")[1];
byte[] bytesFile = Base64.decode(file);
try {
// 创建PutObject请求。
InputStream inputStream = new ByteArrayInputStream(bytesFile);
ossClient.putObject(bucketName, fileName, inputStream);
String url = "http://" + bucketName + "." + endPoint + "/" + fileName;
// System.out.println(url);
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
常量类:
public class SystemConstants {
public static final String Picture_Format_PGN = "png";
public static final String Picture_Format_JPEG = "jpeg";
}
测试:
Base64在线网站:Base64在线工具
将生成的东西复制,测试:
浏览器上输入data里面的内容,看到图片
成功!!!!