OSS存储静态资源(直接上手使用)
  Ldqzsy7vKWbQ 2023年11月13日 77 0


什么是OSS
OSS是对象存储服务(Object Storage Service)的缩写,是一种用于存储和访问大规模数据的云存储服务。它提供了安全、可靠、高扩展性的存储解决方案,可用于存储各种类型的数据,如图片、音频、视频、文档等。OSS具有高可用性和耐久性,能够自动复制数据以保证数据的安全性和可靠性。此外,OSS还提供了简单易用的API和管理控制台,方便用户进行数据的上传、下载、管理和权限控制等操作。
:::
1、如果想白嫖三个月的话从这里领取试用,再进去。(直接进去的话,是收费的 )
阿里云免费试用 - 阿里云

OSS存储静态资源(直接上手使用)_List


2、创建bucket

OSS存储静态资源(直接上手使用)_文件名_02


OSS存储静态资源(直接上手使用)_经验分享_03


2、进入bucket创建文件夹

OSS存储静态资源(直接上手使用)_文件名_04


3、切换到概览列表然后在最下面找到访问端口,我们需要将桶的地域节点与Bucket 域名记下来

OSS存储静态资源(直接上手使用)_负载均衡_05


4、最重要的一步,我们需要一个用户来操作这个bucket。我们需要点击浏览器右上角我们的用户头像,然后列表下有一个AccessKey管理点进去,然后我们就可以创建用户并且创建时需要勾选OpneAi调用访问,创建成功后最好把文件下载下来

OSS存储静态资源(直接上手使用)_经验分享_06


OSS存储静态资源(直接上手使用)_List_07

OSS存储静态资源(直接上手使用)_负载均衡_08


OSS存储静态资源(直接上手使用)_List_09


5、创建成功用户后,我们需要将我们的用户对bucket进行管理,第一个读写权限你可以设置为私有,也可以设置为公共读写,可以根据它的介绍修改。然后就是Bucket授权策略,我们点击新增权限时,选择我们刚刚创建的用户就可以了,然后进行权限设置,可以设置读写,也可以设置完全控制

OSS存储静态资源(直接上手使用)_经验分享_10


OSS存储静态资源(直接上手使用)_List_11


6、这样,搭建就基本完成了。回顾一下,我们需要记住的参数有哪些

  • 桶名
  • 桶外网的地域节点以及地域名
  • 创建用户的秘钥以及秘钥id

7、开始写后端啦,首先将我们的参数写到application.properties中

OSS存储静态资源(直接上手使用)_数据库_12


8、接着我们需要引入一个SDK包

<dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.8.0</version>
        </dependency>

9、开始写逻辑之前,我们还需创建两个实体类,上传图片实体类,获取图片实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UploadFile {
    private String name;//获取图片名
    private String base64; //获取base64
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileInfo {
    private String name; //返回文件名
    private String url;  //返回绝对路径
}

10、终于要写逻辑代码了,其中的步骤已经写到注释上面了

@Service
public class FileService {
//将application.properties写的参数用@Value进行注入
    @Value("${oss.endpoint}")
    private String endpoint;
    @Value("${oss.accessKeyId}")
    private String accessKeyId;
    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${oss.bucketName}")
    private String bucketName;
    @Value("${uploadFile.path}")
    private String path;
    public String upload( UploadFile uploadFile) {
        //获取前端传来的文件名
        String name = uploadFile.getName();
        //为它新起一个名字
        String fileName = System.currentTimeMillis() + "-" + name;
        //获取base
        String base64 = uploadFile.getBase64();
        //将base64用hutool工具进行截取,然后转为数组
        String[] strings = StrUtil.splitToArray(base64, "base64,");
        //base64将数组转为字节
        byte[] decode = Base64.decode(strings[1]);
        //设置存储路径,images是我们在oss中创建的文件夹
        String objectName = "images/" + fileName;
        //通过hutool工具将字节转为一个file文件
      //  File file = FileUtil.writeBytes(decode, fileName);
        //创建OSSClient实例,里面的参数为,地域节点,秘钥id,秘钥
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        //我们将文件放到指定的桶以及文件的绝对的路径
      //  ossClient.putObject(bucketName, objectName, file);
          //将字节数组转换为io流  这个比转换为文件快
        ByteArrayInputStream stream = IoUtil.toStream(decode);
        //写入
        ossClient.putObject(bucketName, objectName, stream);
        //进行关闭
        ossClient.shutdown();
        //返回一个绝对的路径
        return path +"/"+ objectName;
    }
    //获取文件
    public List<FileInfo> select() {
       //定义文件夹名字 加上"/"
        String folderName = "images/";
        //使用构建者模式,创建一个实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
       //通过桶名,我们可以获取桶的所有信息
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        //设置文件夹前缀,我们就可以获取到文件夹下的所有文件
        listObjectsRequest.setPrefix(folderName);
        ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
        //获取所有的文件
        List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
        //我们创建一个List集合,将我们的FileInfo实体类放进去
        final List<FileInfo> imgList = new ArrayList<>();
        //对于获取的所有文件进行遍历,我们需要".jpg"、".png"结尾的,如果你还想要其它的图片后缀,可继续写
        for (OSSObjectSummary objectSummary : objectSummaries) {
            //objectSummary.getKey() 获取文件名
            if (objectSummary.getKey().endsWith(".jpg") || objectSummary.getKey().endsWith(".png")) {
               //获取全路径
                String objectName = objectSummary.getKey();
                //获取文件名,我们需要对文件夹后缀进行截取一下,只要后面的,不截取的话,获取名字时前面它会带一个"/"
                //这是一个bug,我不知道哪里有问题
                String fileName = objectName.substring(objectName.indexOf("/") + 1);
                //创建实例,设置文件名,设置路径
                FileInfo fileInfo = new FileInfo();
                fileInfo.setName(fileName);
                //路径进行拼接,将我们的path,application.properties设置的外网域名
                fileInfo.setUrl(path +"/"+ objectName);
                //将满足条件的添加到list集合中
                imgList.add(fileInfo);
            }
        }
        //返回
        return imgList;
    }
}

11、controller进行注入service后就大功告成了

@RestController
@RequestMapping("/imageapi")
public class FileController{
    @Autowired
    FileService fileService;
    @PostMapping("/upload")
    public String upload(UploadFile uploadFile) {
        return fileService.upload(uploadFile);
    }
    @GetMapping
    public List<FileInfo> select() {
        return fileService.select();
    }
}

12、进行测试

测试上传

返回一个url,这个url我们直接打开的话,会下载下来,但是放到前端的标签中会直接显示下来

OSS存储静态资源(直接上手使用)_经验分享_13


OSS存储静态资源(直接上手使用)_负载均衡_14


测试获取

OSS存储静态资源(直接上手使用)_数据库_15


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
Ldqzsy7vKWbQ
作者其他文章 更多