第一步:引入oss maven坐标
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
第二步:上传工具类
package com.green.testlocalhost.service;
import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.PutObjectResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* @author zdj
* @Description: 阿里云 oss 上传工具类
* @Date: 2019/5/10
*/
@Slf4j
@Data
@Component
public class OssUtil {
private static String endPoint = "yourEndPoint"; // oss域名
private static String accessKeyId = "yourAccessKeyId"; // accessKeyId
private static String accessKeySecret = "yourAccessKeySecret"; // accessKeySecret
private static String bucketName = "yourBucketName"; // 桶名称
private static String fileDir = "animal/"; // 当前文件所属文件夹(就是你想给文件传到那个文件夹下面)
/**
* oss 工具客户端
*/
private static OSSClient ossClient = null;
/**
* 上传文件至阿里云 OSS
* @param file 待上传文件
* 返回访问的全路径
*/
public static String uploadFileToOss(MultipartFile file) {
// 初始化oss
initOSS(endPoint, accessKeyId, accessKeySecret);
String visitUrl = null;
try {
// 获取文件名
String orgName = file.getOriginalFilename();
if (StringUtils.isEmpty(orgName)) {
orgName = file.getName();
}
orgName = getFileName(orgName);
String fileRelName = fileDir + orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
// 上传至oss
PutObjectResult result = ossClient.putObject(bucketName, fileRelName, file.getInputStream());
if (result != null) {
log.info("------OSS文件上传成功------");
}
// 拼接访问路径
visitUrl = "https://" + bucketName + "." + endPoint + "/" + fileRelName;
} catch (IOException e) {
log.error(e.getMessage(), e);
return null;
}
return visitUrl;
}
/**
* 删除文件
* @param fileName
*/
public static void deleteFileToOss(String fileName) {
ossClient.deleteObject(bucketName, fileName);
}
/**
* 初始化 oss 客户端
* @return
*/
private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
if (ossClient == null) {
synchronized (OSSClient.class) {
if (ossClient == null) {
ossClient = new OSSClient(endpoint, new DefaultCredentialProvider(accessKeyId, accessKeySecret), new ClientConfiguration());
// 设置权限(公开读)
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
}
}
}
return ossClient;
}
/**
* 判断文件名是否带盘符,重新处理
* @param fileName
* @return
*/
public static String getFileName(String fileName){
//判断是否带有盘符信息
// Check for Unix-style path
int unixSep = fileName.lastIndexOf('/');
// Check for Windows-style path
int winSep = fileName.lastIndexOf('\\');
// Cut off at latest possible point
int pos = (winSep > unixSep ? winSep : unixSep);
if (pos != -1) {
// Any sort of path separator found...
fileName = fileName.substring(pos + 1);
}
//替换上传文件名字的特殊字符
fileName = fileName.replace("=", "").replace(",", "").replace("&", "").replace("#", "");
return fileName;
}
}
第三步:实用controller
package com.green.testlocalhost.controller;
import com.green.testlocalhost.service.OssService;
import com.green.testlocalhost.vo.ResultData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* @Author zdj
* @Date 2022/10/28 17:11
* @Version 1.0
*/
@Api(tags = "文件管理")
@RestController
@RequestMapping("/file")
public class OssController {
/**
* oss服务类
**/
@Autowired
private OssService ossService;
/**
* 图片上传,返回地址
* @param file
* @return
*/
@RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
@ApiOperation(value = "图片上传接口(返回地址)", notes = "图片上传接口(返回地址)", httpMethod = "POST")
public ResultData fileUpload(@RequestParam(value = "file", required = false) @RequestPart("file") MultipartFile file) throws IOException {
if (file.getBytes() == null) {
return ResultData.error("文件不能为空!");
}
return ossService.fileUpload(file);
}
}
第四步: 实用service类
package com.green.testlocalhost.service;
import com.green.testlocalhost.vo.ResultData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
* @Author zdj
* @Date 2022/10/28 17:22
* @Version 1.0
*/
@Service
public class OssService {
/**
* oss服务类
**/
@Autowired
private OssUtil ossBootUtil;
/**
* 图片上传,返回地址
* @param file
* @return
*/
public ResultData fileUpload(MultipartFile file) {
String upload = ossBootUtil.uploadFileToOss(file);
return ResultData.ok("成功", upload);
}
}
第五步:响应类ResultData
package com.green.testlocalhost.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author zdj
* @Date 2022/10/28 17:24
* @Version 1.0
*/
@Data
public class ResultData<T> {
public static final int CODE_SUCCESS = 200;//成功
public static final int CODE_ERROR = 500; //业务异常
public static final int CODE_EXP = 900; //服务器内部错误
// 响应数据
@ApiModelProperty(value = "响应数据", required = true)
private T data;
// 响应消息
@ApiModelProperty(value = "响应消息", required = true)
private String msg;
// 状态
@ApiModelProperty(value = "响应状态", required = true)
private int code;
public ResultData() {}
public ResultData(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
/**
* 用于写出去响应给浏览器的公告方法
**/
public static <T> ResultData<T> ok(Integer code, String msg, T data) {
ResultData<T> responseData = new ResultData<T>();
responseData.setCode(code);
responseData.setMsg(msg);
responseData.setData(data);
return responseData;
}
/**
* 响应成功
**/
public static <T> ResultData<T> ok(String msg, T data) {
return ResultData.ok(ResultData.CODE_SUCCESS, msg, data);
}
/**
* 响应失败
**/
public static <T> ResultData<T> error(String msg) {
return ResultData.ok(ResultData.CODE_ERROR, msg, null);
}
/**
* 服务器错误
**/
public static <T> ResultData<T> exp() {
return ResultData.ok(ResultData.CODE_EXP, "服务器繁忙,请稍后再试", null);
}
}
第六步:调用测试下
当前工具只是简单的文件上传,需要实现更多的功能,请自行扩展哦!