阿里云OSS服务集成笔记

引言

在现代Web应用开发中,文件存储是一项基础而关键的功能,尤其是处理大量媒体文件时。阿里云对象存储服务(OSS)以其高可用、低成本及大容量特性,成为众多开发者的选择。。本文精要介绍Java项目集成阿里云OSS的实践,聚焦AliOssUtil工具类与FileUploadController,实现文件流式上传至OSS Bucket,并迅速获取文件URL,优化上传效率与用户体验。

一、AliOssUtil工具类

功能概述

AliOssUtil 是一个基于阿里云对象存储服务(OSS)的工具类,用于实现文件(特别是图片)的流式上传。

AliOssUtil代码:

/**
 * Description: 阿里云OSS工具类
 * @since 2024/4/27
 */
public class AliOssUtil {
    private static final String END_POINT = "https://oss-cn-hangzhou.aliyuncs.com";
    private static final String ACCESS_KEY_ID = "ACCESS_KEY_ID";
    private static final String ACCESS_KEY_SECRET ="ACCESS_KEY_SECRET";
    private static final String BUCKET_NAME = "big-event-danty";
    public static String upLoadFile(String objectName, InputStream in) throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(END_POINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET); /*ctrl+p*/
        // url地址组成:https://bucket名称.区域节点/objectName
        String url = "https://"+BUCKET_NAME+"."+END_POINT.substring(END_POINT.lastIndexOf("/")+1)+"/"+objectName;
        try {
            // 填写字符串。
            String content = "Hello OSS,你好世界";

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, in);         
            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return url;
    }

}
关键属性
  • END_POINT: 指定OSS服务的Endpoint,这里以华东1(杭州)为例,实际使用时应根据实际部署的区域进行替换。
  • ACCESS_KEY_ID 和 ACCESS_KEY_SECRET: 分别为阿里云账号的Access Key ID和Access Key Secret,用于身份验证和授权访问OSS服务。在实际项目中,这些敏感信息应妥善保管,避免硬编码,推荐使用环境变量或密钥管理服务。
  • BUCKET_NAME: 存储空间名称,所有上传的文件都将归档于此。

核心方法

upLoadFile(String objectName, InputStream in)

该方法接受两个参数:

  • objectName:要上传到OSS的文件在Bucket中的对象名(即路径+文件名)。
  • in:待上传文件的输入流。
OSSClient
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(END_POINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

OSSClient是阿里云OSS SDK提供的主要类,根本目的用于与OSS服务进行交互,如上传、下载、删除文件等操作。OSSClientBuilder是一个构建器类,通过其build()方法可以便捷地创建OSSClient实例。

URL组成
// url地址组成:https://bucket名称.区域节点/objectName
String url = "https://" + BUCKET_NAME + "." + END_POINT.substring(END_POINT.lastIndexOf("/") + 1) + "/" + objectName;

这段代码是构建上传后文件的访问URL。URL的结构遵循以下规则:

  • https://: 使用HTTPS协议。
  • BUCKET_NAME: 已定义的Bucket名称,即您在OSS中创建的存储空间的名称。
  • .(点): 分隔符,连接Bucket名称和区域节点。
  • END_POINT.substring(END_POINT.lastIndexOf(“/”) + 1): 从Endpoint中提取区域节点。Endpoint通常形式为https://oss-cn-hangzhou.aliyuncs.com,通过截取最后一个/之后的部分得到oss-cn-hangzhou.aliyuncs.com,即区域节点。
  • /(斜杠): 分隔符,连接区域节点和对象名。
  • objectName: 待上传文件在OSS中的对象名,即在Bucket内部的路径+文件名。
PutObjectRequest
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, in);

PutObjectRequest是阿里云OSS SDK中的一个类,用于封装上传文件所需的参数。在这个例子中,创建一个PutObjectRequest对象并传入以下参数:

  • BUCKET_NAME: 已定义的Bucket名称。
  • objectName: 待上传文件在OSS中的对象名。
  • in: 上传文件的输入流,这里通常是MultipartFile对象的getInputStream()方法返回的输入流。

这个PutObjectRequest对象随后会被传递给ossClient.putObject()方法,执行实际的文件上传操作。


方法执行流程:

  1. 创建OSS客户端:使用OSSClientBuilder构建OSS客户端实例,传入Endpoint、Access Key ID和Access Key Secret。

  2. 拼接URL:根据Endpoint、Bucket名和对象名构造上传后文件的访问URL。

    url地址组成:https://bucket名称.区域节点/objectName
    
  3. 创建上传请求::使用PutObjectRequest初始化上传请求,指定Bucket名、对象名以及上传的输入流。

  4. *上传文件:*调用ossClient.putObject(putObjectRequest)方法上传文件。若需设置存储类型、访问权限等元数据,可在此处添加相关代码(目前为注释状态)。

  5. 异常处理:捕获可能抛出的OSSExceptionClientException,打印错误信息。

  6. 关闭客户端连接:无论上传是否成功,最后都要调用ossClient.shutdown()关闭客户端连接。

  7. 返回URL:方法最终返回上传文件的访问URL。

  8. 资源释放:上传完成后关闭OSSClient,避免资源泄露。

二、FileUploadController控制器

功能概述

FileUploadController是Spring MVC框架下的一个控制器,负责处理HTTP POST请求,将用户上传的文件通过AliOssUtil上传至阿里云OSS。

FileUploadController代码:
@RestController
public class FileUploadController {

    @PostMapping("upload")
    public Result<String> upload(MultipartFile file) throws Exception {
        //把文件的内容存储到本地磁盘上
        String originalFilename = file.getOriginalFilename();
        //保证文件名字唯一,防止文件覆盖
        String filename = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));
        /*file.transferTo(new File("C:\\Users\\Administrator\\Pictures\\big_event\\files\\"+filename));*/
        String url = AliOssUtil.upLoadFile(filename, file.getInputStream());
        return Result.success(url);
    }
}

核心方法

upload(MultipartFile file)

接受一个MultipartFile类型的参数,这是Spring MVC用来处理上传文件的标准方式。该方法实现了:

  1. 获取文件原始名:利用getOriginalFilename()获取上传文件的名称。
  2. 生成唯一文件名:结合UUID确保上传文件的唯一性,避免重名覆盖问题。
  3. 调用OSS上传:通过AliOssUtil.upLoadFile()方法,将文件流上传至OSS,并获取文件URL。
  4. 响应处理:将上传成功后的文件访问URL封装进业务响应对象(如Result<String>),并返回给前端或调用者。
MultipartFile
  • MultipartFile 是 Spring Web MVC 中的一个接口,用于处理 HTTP 请求中的多部分文件上传。
  • 当用户通过表单或API提交一个文件时,Spring MVC会自动将其解析为MultipartFile对象,MultipartFile提供了多种方法来访问上传文件的信息和内容,方便在控制器中进行进一步处理。
getOriginalFilename()
  • MultipartFile接口提供的方法,用于获取上传文件的原始文件名,即用户在客户端选择上传时文件在本地的完整文件名,包括扩展名。
  • 例如,如果用户上传了一个名为my_image.jpg的文件,getOriginalFilename()将返回"my_image.jpg"。

方法执行流程:

  1. 获取原始文件名:从MultipartFile对象中获取上传文件的原始文件名。
  2. 生成唯一文件名:为了防止文件覆盖,使用UUID生成一个随机字符串与原始文件名的扩展名拼接成新的唯一文件名。
  3. 调用AliOssUtil上传:将MultipartFile的输入流和生成的唯一文件名传递给AliOssUtil.upLoadFile()方法进行上传。
  4. 返回上传结果:上传成功后,封装包含文件访问URL的Result对象并返回。这里假设Result类是一个用于表示操作结果的泛型类,success()方法用于创建表示成功的响应对象。

实现步骤回顾

  1. 用户发起请求:用户通过网页表单或API客户端向服务器发送一个HTTP POST请求,请求中包含了待上传的文件。
  2. Spring MVC接收与解析:Spring MVC框架自动解析此POST请求,将其中的文件内容封装为MultipartFile对象,便于后续处理。
  3. 控制器处理
    • FileUploadControllerupload()方法被调用,负责处理文件上传逻辑。
    • MultipartFile对象中提取原始文件名,并结合UUID生成一个新的唯一文件名,确保文件存储时不发生命名冲突,提升存储的安全性和管理效率。
  4. 文件上传至OSS
    • 控制器内调用AliOssUtil工具类的upLoadFile()方法。
    • 该方法接收文件的唯一名称和MultipartFile提供的输入流,使用预先配置好的阿里云OSS客户端(含Endpoint、Access Key等信息)。
    • 通过OSS SDK创建PutObjectRequest,执行文件上传操作至指定Bucket。
  5. 上传结果处理
    • 文件上传至OSS成功后,AliOssUtil方法构建文件的公网访问URL。
    • 控制器接收到URL后,封装成响应对象(如Result<String>),其中包含文件的访问链接。
    • 此响应被返回给前端或调用者,用户即可通过此URL直接访问或分享已上传的文件。
  6. 安全保障与优化
    • 在文件名处理阶段采用UUID策略,有效避免文件覆盖和命名冲突,提升系统稳定性。
    • 整个过程中,敏感信息如Access Key等通过配置在AliOssUtil类中,强调了在实际部署中应避免硬编码,推荐使用安全的配置管理方式。

小结

通过本笔记,初步理解了如何在Java项目中集成阿里云OSS服务,从工具类的构建到控制器的实现,每一步都围绕着简化文件上传流程、提高系统稳定性和安全性展开。希望这份笔记能帮助大家更好地掌握阿里云OSS的使用技巧,为未来开发高性能、高可用的Web应用打下坚实基础。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值