springboot 整合阿里云OSS分布式文件存储服务器

大家好今儿给大家带来的是springboot 整合分布式文件存储服务器OSS

1.OSS简单介绍及操作

OSS是一个分布式的文件存储服务,在OSS中提供了很多对应上传下载的api供我们去调用完成对应的需求以及数据处理。
OSS官网:https://help.aliyun.com/product/31815.html
打开上方的oss网址,我们可以看到oss的所有的介绍(可以免费试用)

在这里插入图片描述
试用购买成功后我们去创建Bucket首先搜索OSS
在这里插入图片描述

2.创建Bucket

1.Bucket是水桶的意思,那么我们的数据图片以及视频什么的可以当做水,所以我们先要创建水桶才能去装水~~
在这里插入图片描述
2.在创建Bucket的时候一定要把读写权限改为公共读(否则上传后访问不了图片)
Bucket名称自己随便起。
重点是读写权限 选择完成后我们在点击创建即可
在这里插入图片描述
创建完成后我们可以在bucket列表看到自己刚创建好的水桶(bucket)在这里插入图片描述

3.springboot整合OSS

1.首先导入OSS坐标
我这里用的是3.10.2的版本大家也可以去maven官网去找其他版本的OSS-SDK
https://mvnrepository.com/

  <!--阿里oss 文件存储-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>

2.在文档介绍中我们看可以看到OSS客户端对象需要一些参数来初始化
在这里插入图片描述
3.所以我们在代码中需要把以上这些参数都交给OSS客户端去初始化
所以我们这一步先创建OSS初始化类把OSS交给spring去管理

@Configuration
@ConfigurationProperties(prefix = "oss")
@Data
@Slf4j
public class AliyunConfig {
    private final String endpoint;
    private final String accessKeyId;
    private final String accessKeySecret;
    private final String bucketName;
    private final String url;

    @Bean
    public OSS oSSClient() {
        log.info("阿里云客户端已初始化 endpoint:[{}],accessKeyId:[{}]," +
                "accessKeySecret:[{}],bucketName:[{}],urlPrefix:[{}]"
                ,endpoint,accessKeyId,accessKeySecret,bucketName,url);
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

4.配置yml文件properties文件也是可以的
如果使用properties要在OSS配置类要多个一个注解
@PropertySource(value = {“classpath:文件名称.properties”})

在这里插入图片描述
5.参数
在这里插入图片描述
accessKey
在这里插入图片描述
自己创建一个就行
在这里插入图片描述

4.OSS上传文档介绍

1.在OSS文档中我们可以看到一个简单的快速入门
2.需要三个参数
bucketName:bucket名称(就是要装到哪个水桶里去)
objectName:这个参数的意思就是上传到OSS后的路径,我们可以根据时间分类或者日期等等都可以。比如:2021-1-11/123.jpg
new ByteArrayInputStream(content.getBytes()):这个参数就是文件的流

ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
在这里插入图片描述
3.用上方代码上传成功后我们就可以在Bucket(水桶中找到对应的水)也就是刚传上来的图片
在这里插入图片描述
4.在OSS文档介绍中有很多的案例大家可以根据自己需求找到对应的案例然后稍微改一改就可以用的,比如 上传 断点续传 分片上传等等…
在这里插入图片描述

5.代码部分(可直接用)

1.Controller


@Controller
@Api(value = "阿里云OSS文件存储服务器",description ="阿里云OSS文件存储服务器" )
public class FileUploadController {
    @Autowired
    private FileUploadService fileUploadService;


    @RequestMapping(value = "/file/upload",method = RequestMethod.POST)
    @ApiOperation("上传")
    @ResponseBody
    public FileUploadResult upload(@RequestParam("file") MultipartFile uploadFile) throws Exception {
        return  fileUploadService.upload(uploadFile);
    }


    @RequestMapping(value = "/file/delete",method = RequestMethod.GET)
    @ApiOperation("删除")
    @ResponseBody
    @ApiImplicitParam(name = "文件目录名称",value = "比如:images/2020/11/22/1606034097781942.jpg")
    public FileUploadResult delete(@RequestParam("fileName") String fileName) throws Exception {
        return  fileUploadService.delete(fileName);
    }


    @RequestMapping(value = "/file/list/{size}",method = RequestMethod.GET)
    @ApiOperation("查询oss中全部文件")
    @ResponseBody
    public List<OSSObjectSummary> list(@PathVariable("size") String size) throws Exception {
        return  fileUploadService.list(size);
    }


    @RequestMapping(value = "/file/download",method = RequestMethod.GET)
    @ApiOperation("下载")
    @ResponseBody
    @ApiImplicitParam(name = "文件目录名称",value = "比如:images/2020/11/22/1606034097781942.jpg")
    public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) throws IOException {
        //通知浏览器以附件形式下载
        response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO-8859-1"));
         fileUploadService.exportOssFile(response.getOutputStream(),fileName);
    }
}

2.Service

@Service
public class FileUploadService {
    
    
    //效验上传的格式 可自己维护
    private static final List<String> UPLOAD_TYPE = Stream.of(".bmp", ".jpg", ".jpeg", ".gif", ".png").collect(Collectors.toList());
            
     
    
    @Autowired
    private OSS ossClient;
    @Autowired
    private AliyunConfig aliyunConfig;


    public FileUploadResult upload(MultipartFile uploadFile) throws IOException {
        // 校验图片格式
        boolean isLegal = false;
        for (String type : UPLOAD_TYPE) {
            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),type)) {
                isLegal = true;
                break;
            }
        }
        //封装Result对象,并且将文件的byte数组放置到result对象中
        FileUploadResult fileUploadResult = new FileUploadResult();
        if (!isLegal) {
            fileUploadResult.setResponse("上传格式不支持...");
            return fileUploadResult;
        }
        //文件新路径
        String fileName = uploadFile.getOriginalFilename();
        String filePath = getFilePath(fileName);
        // 上传到阿里云
        // 创建上传Object的Metadata
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(uploadFile.getInputStream().available());
        objectMetadata.setCacheControl("no-cache");//设置Cache-Control请求头,表示用户指定的HTTP请求/回复链的缓存行为:不经过本地缓存
        objectMetadata.setHeader("Pragma", "no-cache");//设置页面不缓存
        objectMetadata.setContentType(getcontentType(uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".")+1)));
        objectMetadata.setContentDisposition("inline;filename=" + uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".")+1) + "." + uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".")));
        try {
            ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()),objectMetadata);
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        fileUploadResult.setStatus("done");
        fileUploadResult.setResponse("上传成功");
        fileUploadResult.setName(this.aliyunConfig.getUrl() + "/" +filePath);
        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));

        //todo 有兴趣的朋友们 可以把 OSS做成一个微服务供其他的服务去调用  根据返回的图片URL存到对应的数据库中
        //todo this.aliyunConfig.getUrl() + "/" +filePath
        return fileUploadResult;
    }

    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "images/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
                RandomUtils.nextInt(100, 9999) + "." +
                StringUtils.substringAfterLast(sourceFileName, ".");
    }


    public List<OSSObjectSummary> list(String size) {
        // 设置最大个数。
        final int maxKeys = Integer.parseInt(size);
        // 列举文件。
        ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));
        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
        return sums;
    }


    public FileUploadResult delete(String objectName) {
        // 根据BucketName,objectName删除文件
        ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);
        FileUploadResult fileUploadResult = new FileUploadResult();
        fileUploadResult.setName(objectName);
        fileUploadResult.setStatus("removed");
        fileUploadResult.setResponse("删除成功");
        return fileUploadResult;
    }
    /**
     * Description: 判断OSS服务文件上传时文件的contentType
     * @param suffix 文件后缀
     * @return String HTTP Content-type
     */
    public static String getcontentType(String suffix) {
        System.out.println("------------>文件格式为:  " + suffix);
        if (suffix.equalsIgnoreCase("bmp")) {
            return "image/bmp";
        } else if (suffix.equalsIgnoreCase("gif")) {
            return "image/gif";
        } else if(suffix.equalsIgnoreCase("jpg")){
            return "image/jpg";
        } else if (suffix.equalsIgnoreCase("jpeg")) {
            return "image/jpeg";
        } else if (suffix.equalsIgnoreCase("png")) {
            return "image/png";
        } else if (suffix.equalsIgnoreCase("html")) {
            return "text/html";
        } else if (suffix.equalsIgnoreCase("txt")) {
            return "text/plain";
        } else if (suffix.equalsIgnoreCase("vsd")) {
            return "application/vnd.visio";
        } else if (suffix.equalsIgnoreCase("pptx") || suffix.equalsIgnoreCase("ppt")) {
            return "application/vnd.ms-powerpoint";
        } else if (suffix.equalsIgnoreCase("docx") || suffix.equalsIgnoreCase("doc")) {
            return "application/msword";
        } else if (suffix.equalsIgnoreCase("xml")) {
            return "text/xml";
        } else if (suffix.equalsIgnoreCase("mp3")) {
            return "audio/mp3";
        } else if (suffix.equalsIgnoreCase("amr")) {
            return "audio/amr";
        } else {
            return "text/plain";
        }
    }

    public void exportOssFile(OutputStream os, String objectName) throws IOException {
        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(aliyunConfig.getBucketName(), objectName);
        // 读取文件内容。
        BufferedInputStream in = new BufferedInputStream(ossObject.getObjectContent());
        BufferedOutputStream out = new BufferedOutputStream(os);
        byte[] buffer = new byte[1024*1024];
        int lenght = 0;
        while ((lenght = in.read(buffer)) != -1) {
            out.write(buffer, 0, lenght);
        }
        if (out != null) {
            out.flush();
            out.close();
        }
        if (in != null) {
            in.close();
        }
    }
}

6.测试

swagger-bootstrap-ui下期有时间教大家整合这个玩
比swagger官方版本好看点感觉。
在这里插入图片描述
在这里插入图片描述

7.总结

OSS是一个分布式的文件存储服务,提供了很多api供我们去完成对应的上传下载等。大家可以根据OSS文档中的一些案例去完成对应的需求。今儿就到这吧,如有问题欢迎留言。

在这里插入图片描述

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值