【二】SpringBoot整合阿里云OSS

SpringBoot整合阿里云OSS

一、简介

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。非常适合存储非结构化数据,例如视频、图形、日志、文本文件以及各种App应用、多终端同步软件、网盘下载站的文件等,单个文件的大小从1字节到48.8TB,可以存储的个数无限制。

二、对OSS的使用

1、创建

【二】SpringBoot整合阿里云OSS_第1张图片
【二】SpringBoot整合阿里云OSS_第2张图片

2、获取oss对外服务的访问域名、oss的存储空间、访问身份验证中用到用户标识、用户用于加密签名字符串和oss用来验证签名字符串的密钥

【二】SpringBoot整合阿里云OSS_第3张图片
【二】SpringBoot整合阿里云OSS_第4张图片

3、SpringBoot 整合 OSS

1.首先导入依赖



<dependency>
    <groupId>com.aliyun.ossgroupId>
    <artifactId>aliyun-sdk-ossartifactId>
    <version>2.8.3version>
dependency>
2.在yaml文件中编辑配置信息
# OSS相关配置信息
aliyun:
  oss:
    endpoint:  # oss对外服务的访问域名
    accessKeyId:  # 访问身份验证中用到用户标识
    accessKeySecret:  # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
    bucketName:  # oss的存储空间
    policy:
      expire: 300 # 签名有效期(S)
    maxSize: 10 # 上传文件大小(M)
    callback: http://localhost:8080/aliyun/oss/callback # 文件上传成功后的回调地址
    dir:
      prefix: /myb/uploadFile # 上传文件夹路径前缀
3.创建OSS的配置类
import com.aliyun.oss.OSSClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * OSS配置类
 */
@Configuration
public class OssConfig {
    @Value("${aliyun.oss.endpoint}")
    private String ALIYUN_OSS_ENDPOINT;
    @Value("${aliyun.oss.accessKeyId}")
    private String ALIYUN_OSS_ACCESSKEYID;
    @Value("${aliyun.oss.accessKeySecret}")
    private String ALIYUN_OSS_ACCESSKEYSECRET;
    @Bean
    public OSSClient ossClient(){
        return new OSSClient(ALIYUN_OSS_ENDPOINT,ALIYUN_OSS_ACCESSKEYID,ALIYUN_OSS_ACCESSKEYSECRET);
    }
}

4.实现上传照片的业务层代码
@Service
public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements IFileService {

    private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);

    @Autowired
    private OSS ossClient;

    @Autowired
    private FileMapper fileMapper;
    @Value("${upload.file.path}")
    private  String  uploadFilePath;


    @Value("${aliyun.oss.policy.expire}")
    private int ALIYUN_OSS_EXPIRE;
    @Value("${aliyun.oss.maxSize}")
    private int ALIYUN_OSS_MAX_SIZE;
    @Value("${aliyun.oss.callback}")
    private String ALIYUN_OSS_CALLBACK;
    @Value("${aliyun.oss.bucketName}")
    private String ALIYUN_OSS_BUCKET_NAME;
    @Value("${aliyun.oss.endpoint}")
    private String ALIYUN_OSS_ENDPOINT;
    @Value("${aliyun.oss.dir.prefix}")
    private String ALIYUN_OSS_DIR_PREFIX;

    // 文件类型
    private static List<String> imageType = new ArrayList<>();

    static {
        imageType.add(".jpg");
        imageType.add(".jpeg");
        imageType.add(".png");
        imageType.add(".gif");
        imageType.add(".webp");
        imageType.add(".bmp");
        imageType.add(".tif");
        imageType.add(".apng");
        imageType.add(".pcx");
        imageType.add(".tga");
        imageType.add(".svg");
        imageType.add(".avif");
    }
	
    /**
     * 上传到阿里云的OSS
     * @param file
     * @param request
     * @return
     */
    @Override
    public ResultBean uploadOSS(MultipartFile file, HttpServletRequest request) {
        // 接受返回的访问路径
        String url = null;
        // 1.创建OSSClient实例  ossClient 上面已经使用@Autowired注入
        
        String originalFilename = "";
        String fileType = "";
        String newFileName = "";
        String savePath = "";
        try {
            // 2.获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            // 3.获取文件名称
            originalFilename = file.getOriginalFilename();
            logger.info("上传图片开始>>>{}", originalFilename);
            int lastIndexOf = originalFilename.lastIndexOf(".");
            // 文件类型
            fileType = originalFilename.substring(lastIndexOf);
            // 判断文件类型是否为图片
            if (!imageType.contains(fileType)) {
                throw new MyException(500, "文件格式正确", "");
            }
            // 4.创建新的文件名称
            //文件新名称
            newFileName = UploadFileUtil.createNewFileName() + fileType;
            logger.info("新的文件名称生成>>>{}", newFileName);
            // 生成保存路径,文件以日期来进行分配
            String format = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
            savePath = format + "/" + newFileName;
//        logger.info("新的文件路径生成>>>{}", savePath + newFileName);

            // 5.调用oss方法上传到阿里云
            //第一个参数:Bucket名称
            //第二个参数:上传到oss文件路径和文件名称
            //第三个参数:上传文件输入流
            ossClient.putObject(ALIYUN_OSS_BUCKET_NAME , savePath, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
            return ResultBean.error("上传失败");
        }
        // 6.把上传后把文件url返回
        //https://xppll.oss-cn-beijing.aliyuncs.com/01.jpg
        url = "https://" + ALIYUN_OSS_BUCKET_NAME + "." + ALIYUN_OSS_ENDPOINT + "/" + savePath;

        // 上传成功 则对数据进行保存
        File saveFileInfo = new File();
        saveFileInfo.setFileName(newFileName);
        saveFileInfo.setFileOldname(originalFilename);
        saveFileInfo.setFileType(fileType);
        saveFileInfo.setFileUrl(url);
        saveFileInfo.setSavePath(savePath);
        saveFileInfo.setClassId("0");
        User loginUserInfo = SecurityUtils.getLoginUser();
        saveFileInfo.setCreateId(loginUserInfo.getId());
        saveFileInfo.setCreateTime(LocalDateTime.now());
        int result = fileMapper.insertImage(saveFileInfo);
        logger.info("上传文件信息保存成功>>>{}", result);
        return ResultBean.success("上传图片完成", url);
    }
}
5.编辑文件上传的控制层
/**
 * 

* 附件信息 *

* * @author mengyb * @since 2022-11-30 */
@RestController @RequestMapping("/file") public class FileController { @Autowired private IFileService fileService; @ApiOperation(value = "上传图片") @PostMapping("/uploadImage") public ResultBean uploadImage(MultipartFile file, HttpServletRequest request, HttpServletResponse response) { ResultBean resultBean = fileService.uploadOSS(file, request); return resultBean; } }

【注】 到此结束,如需要测试的,请自行进行测试,这里不再将测试结果进行展示。本文章仅适用于初步学习,如果有特殊需求请查看API文档。

你可能感兴趣的:(学习笔记,阿里云,java,spring,boot)