SpringBoot 操作阿里云 OSS 服务器

记忆备注 📝 :bucket是一个单独的仓库,仓库内无论目录 还是其他资源 统一都视为资源,定位和存储资源的方式,就是要将资源在bucket中的相对位置描述清楚。

SDK 中很多的 API 参数都是(String bucketName,String path)的形式,根据上述的记忆备注,也就很好理解了。

1. 依赖

注意版本,以 Maven 仓库或者最新的官方文档为主

xml 复制代码
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

2. 前期准备

  1. accessKeyId
  2. secretAccessKey
  3. 创建一个 bucket

3. 任务学习

3.1 接口

Controller 简易接口。注意 bucketNamepath需要定义清楚,这里的 path 传入表示的是目录。OSSUtils是一个工具类,在 4.2 将讲述。

  1. 上传的接口
java 复制代码
@PostMapping("/uploadFile")  
public Boolean uploadFile(@RequestParam("file") MultipartFile file) {  
    // check
    try {  
        boolean upload = OSSUtils.upload(bucketName, path, file);  
        return upload;  
    }catch (Exception e) {  
        // 打印日志
        return false;
    }  
}
  1. 查看和下载的接口

使用了统一的返回体

java 复制代码
public WebResultVO<JSONArray> getClusterRsList() {  
    try {  
        JSONArray arr = OSSUtils.list(bucketName, path);  
        return WebResultVO.success(arr);  
    } catch (Exception e) {  
        return WebResultVO.failure(e.getMessage()); 
    }  
}

3.2 工具类

提供两个方法:上传列表(包括下载链接)

  1. 客户端

创建客户端的目的就是为了使用其 API 操作 OSS 服务器。原则是执行一个操作时生成一个cliet,操作执行完毕后关闭client。

该静态方法可以写在工具类中,每次调用生成一个新的 client

java 复制代码
public static OSS buildOssClient() {  
    return new OSSClientBuilder().build("endpoint", "accessKeyId", "secretAccessKey");  
}
  1. 上传

上传涉及到文件的名称以及后缀的处理,本文使用的是 Spring 提供的 MultipartFile,它提供了 API 帮助我们完成文件名的操作。

abc.txt 为例子:

java 复制代码
String fileName = file.getOriginalFilename();   // abc.txt
String baseName = FileNameUtil.getBaseName(fileName);  // abc
String extension = FileNameUtil.getExtension(fileName); // txt

这里用到了一个依赖:jodd

java 复制代码
public static boolean upload(String bucketName, String path, MultipartFile file) throws Exception {
    // 获取到 client
    OSS ossClient = OSSUtils.buildOssClient();  
        try {  
            InputStream is = file.getInputStream();  
            String fileName = file.getOriginalFilename();  
            String baseName = FileNameUtil.getBaseName(fileName);  
            String extension = FileNameUtil.getExtension(fileName);
            ossClient.putObject(bucketName, path + "/" + baseName + "." + extension, is);  
            return true;  
        } catch (Exception e) {  
            throw new Exception("上传文件失败");  
        } finally {  
            if (ossClient != null) {  
                ossClient.shutdown();  
            }  
    }  
}

9行,如果目录未定义的话会报错,因为会使 / 开头,这样是不被允许的。如果想直接存放在 bucket 中,第二个参数,直接写文件名即可。

  1. 列表

使用 FastJson 提供的 JSONArray,最终的返回结果长这样。

json 复制代码
{
  "code": "10000",
  "msg": "接口请求成功",
  "entity": [
    {
      "fileName": "11.30_XXX.xlsx",
      "fileUrl": "http://XXX"
    },
    {
      "fileName": "11.30_XXX.xlsx",
      "fileUrl": "http://XXX"
    }
  ],
  "success": true
}

这里直接上代码了

java 复制代码
public static JSONArray list(String bucketName, String path) throws ResultException {  
    // 列举文件。  
    OSS ossClient = OSSUtils.buildOssClient();  
    try {  
        // 前缀是 path  
        ObjectListing objectListing = ossClient.listObjects(bucketName, path);  
        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();  
        if (ObjectUtils.isEmpty(sums)) {  
            return new JSONArray();  
        }  
        JSONArray arr = new JSONArray();  
        for (OSSObjectSummary s : sums) {  
            if (s.getSize() <= 0) { 
                // 避免目录
                continue;  
            }  
            //key的格式是 /path/fileName.后缀  
            String key = s.getKey();
            // TODO 提取文件名
            obj.put("fileName", fileName);  
            obj.put("fileUrl", getUrl(bucketName, key));  
            arr.add(obj);  
        }  
        return arr;  
        } catch (Exception e) {  
            throw new Exception("获取文件列表失败");  
        } finally {  
            if (ossClient != null) {  
            ossClient.shutdown();  
        }  
    }  
}

这里省略了一些代码,核心思想在第6行,这里是遍历bucket中前缀是path的内容,会把目录和完整文件路径前包含path的都检索到。

获取可下载的资源路径也比较简单,直接用下面的代码就行,这里的path是资源的完整路径。

java 复制代码
    private static String getUrl(String bucketName,String path){
        OSS ossClient = buildOssClient();
        // 设置URL过期时间为1小时
        Date expiration = new Date(new Date().getTime() + 3600 * 1000);
        GeneratePresignedUrlRequest generatePresignedUrlRequest ;
        generatePresignedUrlRequest =new GeneratePresignedUrlRequest(bucketName, path);
        generatePresignedUrlRequest.setExpiration(expiration);
        URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
        return url.toString();
    }
相关推荐
37手游后端团队24 分钟前
8分钟带你看懂什么是MCP
人工智能·后端·面试
小华同学ai1 小时前
千万别错过!这个国产开源项目彻底改变了你的域名资产管理方式,收藏它相当于多一个安全专家!
前端·后端·github
Vowwwwwww1 小时前
GIT历史存在大文件的解决办法
前端·git·后端
阿杆1 小时前
大故障,阿里云核心域名疑似被劫持
云计算·阿里巴巴
捡田螺的小男孩2 小时前
京东一面:接口性能优化,有哪些经验和手段
java·后端·面试
艾露z2 小时前
深度解析Mysql中MVCC的工作机制
java·数据库·后端·mysql
前端付豪2 小时前
揭秘网易统一日志采集与故障定位平台揭秘:如何在亿级请求中1分钟定位线上异常
前端·后端·架构
陈随易2 小时前
Lodash 杀手来了!es-toolkit v1.39.0 已完全兼容4年未更新的 Lodash
前端·后端·程序员
未来影子2 小时前
SpringAI(GA):Nacos3下的分布式MCP
后端·架构·ai编程
Hockor3 小时前
写给前端的 Python 教程三(字符串驻留和小整数池)
前端·后端·python