【二】SpringBoot整合阿里云OSS

SpringBoot整合阿里云OSS

一、简介

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

二、对OSS的使用

1、创建

创建Bucket1
创建Bucket2

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

获取oss对外服务的访问域名和oss的存储空间
获取加密和验证的信息

3、SpringBoot 整合 OSS

1.首先导入依赖

<!--   阿里云的OSS     -->
<!-- OSS SDK 相关依赖 -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.3</version>
</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.编辑文件上传的控制层
/**
 * <p>
 * 附件信息 
 * </p>
 *
 * @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文档。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值