在Springboot项目中实现将文件上传至阿里云 OSS

oss介绍

阿里云对象存储服务(OSS)是一种高效、安全和成本低廉的数据存储服务,可以用来存储和管理海量的数据文件。本文将教你如何使用 Java 将文件上传到阿里云 OSS,并实现访问文件。

1. 准备工作

1.1 开通 OSS 服务

登录阿里云官网,进入 OSS 控制台,创建一个存储桶(Bucket)。配置时需注意:

  • Bucket 名称:必须是全球唯一。
  • 访问权限 :根据需求选择 公共读私有

1.2 获取访问密钥

在阿里云控制台,进入 AccessKey 管理页面 ,创建 AccessKey 并保存 AccessKey IDAccessKey Secret


2. 引入必要的依赖

2.1 Maven 依赖

确保你的项目使用 Maven 管理,在 pom.xml 文件中添加阿里云 OSS 的依赖:

java 复制代码
!--阿里云oss依赖坐标-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.17.4</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- no more than 2.3.3-->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </dependency>

3. 配置上传工具类

创建一个工具类 AliOssUtil,实现文件上传功能。

工具类代码

java 复制代码
package com.itzx.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.InputStream;

public class AliOssUtil {
    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private static final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";
    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    private static final String ACCESS_KEY_ID = "LTAI5tGszDz8GJEHECogCh4P";
    private static final String ACCESS_KEY_SECRET = "uJOmUYxkB3Cn8oQAiLhvmNYYIt59Em";
    // 填写Bucket名称,例如examplebucket。
    private static final String BUCKET_NAME = "zx-0415-zk";

    public static String uploadFile(String objectName, InputStream in) throws Exception {
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        String url="";
        try {
            // 填写字符串。
            String content = "Hello OSS,你好世界";

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, in);
            
            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            //url组成
            url = "https://" + BUCKET_NAME + "." + ENDPOINT.replace("https://", "").replace("http://", "") + "/" + objectName;

        } 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;
    }
}

4. 测试文件上传功能

编写测试代码调用工具类,验证文件上传功能。

测试代码

java 复制代码
package com.itzx.controller;

import com.itzx.pojo.Result;
import com.itzx.utils.AliOssUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

@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("."));
        String url= AliOssUtil.uploadFile(filename, file.getInputStream());
        return Result.success(url);
    }
}

5. 注意事项

  1. Endpoint 配置

    根据你的 OSS 所在的地域选择对应的 Endpoint,例如华北 2(北京)是 https://oss-cn-beijing.aliyuncs.com

  2. 访问权限

    • 如果文件需要公开访问,可以设置 ObjectAclPublicRead
    • 如果是私有文件,需要生成带签名的 URL,供临时访问。
  3. 路径规范
    objectName 是文件在 OSS 中的完整路径。例如:folder/file.jpg,可以通过路径管理文件层级。


6. 示例结果

运行测试代码后,上传成功会返回文件的 URL,例如:

java 复制代码
https://your-bucket-name.oss-cn-beijing.aliyuncs.com/uploads/test-image.jpg

如果访问权限设置为 公共读,可以直接访问该 URL 查看文件。


7. 总结

本文介绍了如何使用 Java 将文件上传至阿里云 OSS,包括配置工具类、设置文件权限和生成访问 URL。通过简单的工具类封装,可以轻松实现文件上传功能。

相关推荐
a程序小傲3 分钟前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红5 分钟前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥6 分钟前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v16 分钟前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地29 分钟前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209251 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei1 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot
Yuer20252 小时前
什么是 Rust 语境下的“量化算子”——一个工程对象的最小定义
开发语言·后端·rust·edca os·可控ai
记得开心一点嘛2 小时前
Redis封装类
java·redis
短剑重铸之日2 小时前
《7天学会Redis》Day 5 - Redis Cluster集群架构
数据库·redis·后端·缓存·架构·cluster