使用阿里云OSS存储文件

浅浅的花香味﹌ 2022-11-21 11:26 564阅读 0赞

使用阿里云OSS存储文件

  • 创建 bucket (存储空间)

存储类型选择 低频访问存储
同城冗余存储选择 关闭
版本控制选择 不开通
读写权限选择 公共读写
服务端加密方式选择
实时日志查询选择 不开通
在这里插入图片描述


  • 创建 RAM 账号

勾选 控制台访问编程访问
控制台密码选择 自动生成默认密码
要求重置密码选择 无需重置
多因素认证选择 无需开启
在这里插入图片描述

  • 确定创建后,将进入以下页面,注意保存 AccessKey 信息(关闭该页面后将不再显示)

在这里插入图片描述


  • 创建 用户组,并授予 OSS 相关权限,将刚刚创建的 RAM 账号添加进该用户组
    在这里插入图片描述
    在这里插入图片描述
  • 在项目中添加以下依赖:


    com.aliyun.oss
    aliyun-sdk-oss
    3.10.2


    joda-time
    joda-time
    2.9.9
  • 在application.yml 中添加 endpoint 和 accessKey 相关信息

注:endpoint 必须与 创建的 bucket 所在区域保持一致,我这里选择的是杭州节点

  1. alioss:
  2. endpoint: oss-cn-hangzhou.aliyuncs.com
  3. accessKeyId: LTAI4G8eXoyQNb7iJ7ZyyWkL
  4. accessKeySecret: pwnebkgnxaTjjP21EFoeFaFdCmWeUD
  5. bucketName: blu-bucket-test

可以在之前创建的 bucket 中查找到 与之对应的 endpoint 信息:
在这里插入图片描述

  • 创建 OssEntity 实体类,绑定配置文件中的 accessKey 信息,并加上 @Component 注解

    @Data
    @Component
    @ConfigurationProperties(prefix = “alioss”)
    public class OssEntity {

    1. private String endpoint;
    2. private String accessKeyId;
    3. private String accessKeySecret;
    4. private String bucketName;

    }

  • AliOssService 接口

    package com.blu.service;

    import java.io.IOException;

    import org.springframework.web.multipart.MultipartFile;

    public interface AliOssService {

    1. /** * 创建存储空间bucket */
    2. void createBucket();
    3. /** * 上传文件 */
    4. String upload(MultipartFile file);
    5. /** * 下载文件 */
    6. void download(String fileName) throws IOException;
    7. /** * 列举文件 */
    8. void listFile();
    9. /** * 删除文件 */
    10. void deleteFile(String fileName);

    }

  • AliOssServiceImpl

    package com.blu.service.Impl;

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.UUID;

    import org.joda.time.DateTime;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.MultipartFile;

    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.model.CannedAccessControlList;
    import com.aliyun.oss.model.OSSObjectSummary;
    import com.aliyun.oss.model.ObjectListing;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.blu.entity.OssEntity;
    import com.blu.service.AliOssService;

    @Service
    public class AliOssServiceImpl implements AliOssService,InitializingBean {

    1. @Autowired
    2. private OssEntity ossEntity;
    3. private String endpoint;
    4. private String accessKeyId;
    5. private String accessKeySecret;
    6. private String bucketName;
    7. /** * 初始化Bean之后需要进行的操作 */
    8. @Override
    9. public void afterPropertiesSet() throws Exception {
    10. endpoint = ossEntity.getEndpoint();
    11. accessKeyId = ossEntity.getAccessKeyId();
    12. accessKeySecret = ossEntity.getAccessKeySecret();
    13. bucketName = ossEntity.getBucketName();
    14. }
    15. @Override
    16. public void createBucket() {
    17. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
    18. if(ossClient.doesBucketExist(bucketName)) {
    19. throw new RuntimeException(bucketName+ "在对象存储的Bucket列表中已经存在");
    20. } else {
    21. ossClient.createBucket(bucketName);
    22. }
    23. ossClient.shutdown();
    24. }
    25. @Override
    26. public String upload(MultipartFile file) {
    27. String uploadUrl = null;
    28. try {
    29. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    30. if(!ossClient.doesBucketExist(bucketName)){
    31. //创建Bucket
    32. ossClient.createBucket(bucketName);
    33. //设置bucket的属性为公共读
    34. ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
    35. }
    36. //获取上传的文件流
    37. InputStream inputStream = file.getInputStream();
    38. //构建日期的文件夹路径 avator/2020/10/14/文件名
    39. String datePath = new DateTime().toString("yyyy/MM/dd");
    40. //获取上传文件的全名称
    41. String originalFilename = file.getOriginalFilename();
    42. //获取UUID,并去除横杠 a98059d4-633c-4b55-b310-93c997cf8038
    43. String fileName = UUID.randomUUID().toString().replaceAll("-", "");
    44. //获取上传文件的扩展名
    45. String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
    46. //拼接文件名称
    47. String newName = fileName + fileType;
    48. //生成文件夹+文件名 avator/2020/10/14/a98059d4633c4b55b31093c997cf8038.jpg
    49. fileName = datePath + "/" + newName;
    50. //如果想要实现图片预览的效果,一定要设置以下几点:
    51. //1.设置文件的ACL(权限)为公共读或公共读写
    52. //2.设置文本类型(image/jpg)
    53. ObjectMetadata objectMetadata = new ObjectMetadata();
    54. objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
    55. objectMetadata.setContentType(getContentType(fileType));
    56. //上传文件
    57. ossClient.putObject(bucketName,fileName,inputStream,objectMetadata);
    58. //关闭ossClient
    59. ossClient.shutdown();
    60. //默认十年不过期
    61. Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
    62. uploadUrl = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
    63. } catch (IOException e) {
    64. e.printStackTrace();
    65. }
    66. return uploadUrl.substring(0,uploadUrl.indexOf("?"));
    67. }
    68. @Override
    69. public void download(String fileName) throws IOException {
    70. }
    71. @Override
    72. public void listFile() {
    73. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    74. ObjectListing objectListing = ossClient.listObjects(bucketName);
    75. for (OSSObjectSummary ossObjectSummary : objectListing.getObjectSummaries()) {
    76. System.out.println("-"+ossObjectSummary.getKey()+" "+"(size = "+ ossObjectSummary.getSize() + ")");
    77. }
    78. //关闭ossClient
    79. ossClient.shutdown();
    80. }
    81. @Override
    82. public void deleteFile(String fileName) {
    83. String objectName = fileName;
    84. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    85. ossClient.deleteObject(bucketName,objectName);
    86. ossClient.shutdown();
    87. }
    88. public static String getContentType(String FilenameExtension) {
    89. if (FilenameExtension.equalsIgnoreCase(".bmp")) {
    90. return "image/bmp";
    91. }
    92. if (FilenameExtension.equalsIgnoreCase(".gif")) {
    93. return "image/gif";
    94. }
    95. if (FilenameExtension.equalsIgnoreCase(".jpg")) {
    96. return "image/jpg";
    97. }
    98. if (FilenameExtension.equalsIgnoreCase(".png")) {
    99. return "image/png";
    100. }
    101. if (FilenameExtension.equalsIgnoreCase(".jpeg")) {
    102. return "image/jpeg";
    103. }
    104. if (FilenameExtension.equalsIgnoreCase(".vsd")) {
    105. return "application/vnd.visio";
    106. }
    107. if (FilenameExtension.equalsIgnoreCase(".pptx")) {
    108. return "application/vnd.ms-powerpoint";
    109. }
    110. if (FilenameExtension.equalsIgnoreCase(".ppt")) {
    111. return "application/vnd.ms-powerpoint";
    112. }
    113. if (FilenameExtension.equalsIgnoreCase(".docx")) {
    114. return "application/msword";
    115. }
    116. if (FilenameExtension.equalsIgnoreCase(".doc")) {
    117. return "application/msword";
    118. }
    119. if (FilenameExtension.equalsIgnoreCase(".xml")) {
    120. return "text/xml";
    121. }
    122. if (FilenameExtension.equalsIgnoreCase(".html")) {
    123. return "text/html";
    124. }
    125. if (FilenameExtension.equalsIgnoreCase(".txt")) {
    126. return "text/plain";
    127. }
    128. return "text/plain";
    129. }

    }

发表评论

表情:
评论列表 (有 0 条评论,564人围观)

还没有评论,来说两句吧...

相关阅读

    相关 阿里存储OSS

    为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案- 阿里云OSS。 一 开通“对象存储OSS”服务 1 申请阿里云账号 2 实名认证 3 开