使用SDK访问OSS
确认常量:
endpoint(外网访问):oss-cn-beijing.aliyuncs.com
bucketName:college-file-210208
用户登录名称 210208@1620937938245015.onaliyun.com
AccessKeyID: LTAI5t5pe4vDtkSr5Sg7ScAU
AccessKeySecret: OsIBpe186YbAuF1l3pPbBTXewJR1hD
新建云存储微服务
pom.xml
<parent>
<artifactId>service</artifactId>
<groupId>com.jun</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service_oss</artifactId>
<dependencies>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 8120
spring:
profiles:
active: dev
application:
name: service-oss
aliyun:
oss:
endpoint: 你的endponit
keyid: 你的阿里云keyid
keysecret: 你的阿里云keysecret
bucketname: guli-file
启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"com.jun.guli"})
public class ServiceOssApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceOssApplication.class, args);
}
}
可能出现的错误

- 原因:jdbc依赖引入项目后,springboot的自动配置试图在配置文件中查找jdbc相关配置
- 解决方案:主类上添加注解exclude属性,禁用jdbc自动配置@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
实现文件上传
1.从配置文件读取常量
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {
private String endpoint;
private String bucketname;
private String keyid;
private String keysecret;
}
2.FileService.java
public interface FileService {
String upload(InputStream inputStream, String module, String originalFilename);
void removeFile(String url);
}
3.FileServiceImpl.java
@Service
public class FileServiceImpl implements FileService {
@Autowired
private OssProperties ossProperties;
@Override
public String upload(InputStream inputStream, String module, String originalFilename) {
String endpoint = ossProperties.getEndpoint();
String keyid = ossProperties.getKeyid();
String keysecret = ossProperties.getKeysecret();
String bucketname = ossProperties.getBucketname();
OSS ossClient = new OSSClientBuilder().build(endpoint, keyid, keysecret);
if (!ossClient.doesBucketExist(bucketname)) {
ossClient.createBucket(bucketname);
ossClient.setBucketAcl(bucketname, CannedAccessControlList.PublicRead);
}
String folder = new DateTime().toString("yyyy/MM/dd");
String fileName = UUID.randomUUID().toString();
String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
String key = module + "/" + folder + "/" + fileName + fileExtension;
ossClient.putObject(ossProperties.getBucketname(), key, inputStream);
ossClient.shutdown();
return "https://" + bucketname + "." + endpoint + "/" + key;
}
@Override
public void removeFile(String url) {
String endpoint = ossProperties.getEndpoint();
String keyid = ossProperties.getKeyid();
String keysecret = ossProperties.getKeysecret();
String bucketname = ossProperties.getBucketname();
OSS ossClient = new OSSClientBuilder().build(endpoint, keyid, keysecret);
String host = "https://" + bucketname + "." + endpoint + "/";
String objectName = url.substring(host.length());
ossClient.deleteObject(bucketname, objectName);
ossClient.shutdown();
}
}
删除讲师头像需要OpenFeign
4.FileController.java
@Api(description="阿里云文件管理")
@Slf4j
@RestController
@RequestMapping("/admin/oss/file")
public class FileController {
@Autowired
private FileService fileService;
@ApiOperation("文件上传")
@PostMapping("upload")
public R upload(
@ApiParam(value = "文件", required = true)
@RequestParam("file") MultipartFile file,
@ApiParam(value = "模块", required = true)
@RequestParam("module") String module){
try {
InputStream inputStream = file.getInputStream();
String originalFilename = file.getOriginalFilename();
String uploadUrl = fileService.upload(inputStream, module, originalFilename);
return R.ok().message("文件上传成功").data("url", uploadUrl);
} catch (Exception e) {
log.error(ExceptionUtils.getMessage(e));
throw new GuliException(ResultCodeEnum.FILE_UPLOAD_ERROR);
}
}
@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
log.info("oss test被调用");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return R.ok();
}
@ApiOperation("文件删除")
@DeleteMapping("remove")
public R removeFile(
@ApiParam(value = "要删除的文件路径", required = true)
@RequestBody String url) {
fileService.removeFile(url);
return R.ok().message("文件刪除成功");
}
}
- 通过:
http://localhost:8120/swagger-ui.html
测试接口
自定义异常
GuliException.java
@Data
public class GuliException extends RuntimeException {
private Integer code;
public GuliException(Integer code, String message) {
super(message);
this.code=code;
}
public GuliException(ResultCodeEnum resultCodeEnum) {
super(resultCodeEnum.getMessage());
this.code = resultCodeEnum.getCode();
}
@Override
public String toString() {
return "GuliException{" +
"code=" + code +
", message=" + this.getMessage() +
'}';
}
}
GlobalExceptionHandler.java
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public R error(Exception e){
log.error(ExceptionUtils.getMessage(e));
return R.error();
}
@ExceptionHandler(BadSqlGrammarException.class)
@ResponseBody
public R error(BadSqlGrammarException e){
log.error(ExceptionUtils.getMessage(e));
return R.setResult(ResultCodeEnum.BAD_SQL_GRAMMAR);
}
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public R error(HttpMessageNotReadableException e){
e.printStackTrace();
log.error(ExceptionUtils.getMessage(e));
return R.setResult(ResultCodeEnum.JSON_PARSE_ERROR);
}
@ExceptionHandler(GuliException.class)
@ResponseBody
public R error(GuliException e){
log.error(ExceptionUtils.getMessage(e));
return R.error().message(e.getMessage()).code(e.getCode());
}
}