第一步:导入依赖jar包

    1. <!-- 阿里云对象存储-OSS &ndash;&gt;-->
    2. <dependency>
    3. <groupId>com.aliyun.oss</groupId>
    4. <artifactId>aliyun-sdk-oss</artifactId>
    5. <version>3.10.2</version>
    6. </dependency>

    注意:第二步到第四部的代码直接粘贴复制,个别地方改一下
    第二步:封装工具类

    1. package com.mhy.boot_plus.utils;
    2. //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
    3. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡖⠒⠒⠤⢄⠀⠀
    4. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠁⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
    5. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
    6. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
    7. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
    8. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
    9. // ⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
    10. // ⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
    11. // ⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀:⠃⠀⠀⡗⠀⠀⠀⠀⠀
    12. // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
    13. // ⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
    14. // ⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
    15. // ⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
    16. // ⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
    17. // ⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
    18. // ⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
    19. // ⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
    20. // ⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
    21. // ⠀⠙⣌⠳ 小马无忧 ⡏⠀⠀⠈⠳⡌⣦⠀⠀⠀
    22. // ⠀⠀⠈⢳⣈⣻ ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
    23. // ⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
    24. // ⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
    25. // ⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
    26. // ⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
    27. // ⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
    28. // ⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
    29. // ⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
    30. // ⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
    31. // ⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
    32. // ⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
    33. // ⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽⠀
    34. import com.aliyun.oss.OSS;
    35. import com.aliyun.oss.OSSClientBuilder;
    36. import org.springframework.web.multipart.MultipartFile;
    37. import java.io.ByteArrayInputStream;
    38. import java.io.File;
    39. import java.util.Calendar;
    40. import java.util.Date;
    41. public class AliOssUtils {
    42. // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    43. //这个在自己的oss里面找见图一
    44. static String endpoint = "oss-cn-hangzhou.aliyuncs.com";
    45. // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    46. //需要密钥对的id与秘钥,找不到的时候就删除重新创建一次用户,步骤如图二
    47. static String accessKeyId = "LTAI5tSTKkTMJhoQQpmVCGwV";
    48. static String accessKeySecret = "ViYG3tz07V1KBX6RuVSSOS1PZrP66i";
    49. //这个就是bucket容器的名字
    50. static String bucket="mh370";
    51. // 创建OSSClient实例。
    52. //必须有
    53. public static OSS ossClient ;
    54. static {
    55. ossClient= new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    56. }
    57. /**
    58. * 实现资源上传,并获取访问路径(定义的上传方法)
    59. */
    60. public static String upload(String obj, byte[] data, Date date){
    61. //1.实现资源上传
    62. ossClient.putObject(bucket,obj,new ByteArrayInputStream(data));
    63. //2.生成访问路径
    64. return ossClient.generatePresignedUrl(bucket,obj,date).toString();
    65. }
    66. /**
    67. * 实现资源的删除(定义的上传方法)
    68. */
    69. public static boolean delete(String obj){
    70. try{
    71. ossClient.deleteObject(bucket,obj);
    72. return true;
    73. }catch (Exception e){
    74. return false;
    75. }
    76. }
    77. /**
    78. * 验证资源是否存在(定义的上传方法)
    79. */
    80. public static boolean exists(String obj){
    81. return ossClient.doesObjectExist(bucket,obj);
    82. }
    83. /**
    84. * 创建对象的访问链接(访问时效时可以使用)
    85. */
    86. public static String createUrl(String obj,Date date){
    87. return ossClient.generatePresignedUrl(bucket,obj,date).toString();
    88. }
    89. }

    image.png
    image.png
    image.png
    image.png
    第三步:为了防止文件名重复或者过长封装的工具类

    1. package com.feri.bootplusstudy.util;
    2. import java.util.UUID;
    3. /**
    4. * @author Feri
    5. * @date 2021/12/28 17:07
    6. * @description:TODO
    7. */
    8. public class FileUtils {
    9. /**
    10. * 实现上传的文件名,限制长度,并且重新命名*/
    11. public static String rename(String fn){
    12. //1.保证长度在可控范围
    13. if(fn.length()>50){
    14. fn.substring(fn.length()-50);
    15. }
    16. //2.重命名,保证名称唯一
    17. return UUID.randomUUID().toString().replaceAll("-","")+"_"+fn;
    18. }
    19. }

    第四步:获取地址有效时间的工具类

    1. package com.feri.bootplusstudy.util;
    2. import java.util.Calendar;
    3. import java.util.Date;
    4. /**
    5. * @author Feri
    6. * @date 2021/12/28 17:19
    7. * @description:TODO
    8. */
    9. public class DateUtils {
    10. /**
    11. * 获取指定年后的日期*/
    12. public static Date getYearTime(int year){
    13. //1.日历类
    14. Calendar calendar=Calendar.getInstance();
    15. //2.添加指定的年
    16. calendar.add(Calendar.YEAR,year);
    17. return calendar.getTime();
    18. }
    19. }

    第五步:为了防止上传文件过大需要在application.yml配置文件中添加配置

    1. servlet:
    2. multipart:
    3. max-file-size: 10MB
    4. max-request-size: 30MB

    最后是controller层的实例

    1. package com.feri.bootplusstudy.controller;
    2. import com.feri.bootplusstudy.util.AliOssUtils;
    3. import com.feri.bootplusstudy.util.DateUtils;
    4. import com.feri.bootplusstudy.util.FileUtils;
    5. import org.springframework.web.bind.annotation.PostMapping;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.bind.annotation.RequestPart;
    8. import org.springframework.web.bind.annotation.RestController;
    9. import org.springframework.web.multipart.MultipartFile;
    10. import java.io.IOException;
    11. import java.util.Calendar;
    12. /**
    13. * @author Feri
    14. * @date 2021/12/28 16:54
    15. * @description:TODO
    16. */
    17. @RestController
    18. @RequestMapping("/api/oss/")
    19. public class OssController {
    20. @PostMapping("uploadimg.do")
    21. public String upload(@RequestPart("file") MultipartFile file) throws IOException {
    22. String fn= FileUtils.rename(file.getOriginalFilename());
    23. return AliOssUtils.upload(fn,file.getBytes(), DateUtils.getYearTime(1));
    24. }
    25. }