在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。通过简单的工具类封装,可以轻松实现文件上传功能。

相关推荐
Victor35621 分钟前
Redis(164)如何使用Redis实现排行榜?
后端
Victor35627 分钟前
Redis(165)如何使用Redis实现推荐系统?
后端
百万蹄蹄向前冲5 小时前
Trae Genimi3跟着官网学实时通信 Socket.io框架
前端·后端·websocket
狂炫冰美式5 小时前
TRAE SOLO 驱动:重构AI模拟面试产品的复盘
前端·后端·面试
x***38168 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
S***84888 小时前
SpringSecurity踢出指定用户
java
p***s918 小时前
Spring数据库原理 之 DataSource
java·数据库·spring
adobehu8 小时前
麒麟系统安装jdk17
java·jdk
spencer_tseng8 小时前
java.util.IllegalFormatPrecisionException
java·printf
虹科网络安全8 小时前
艾体宝干货 | Redis Java 开发系列#1 从零开始的环境搭建与实践指南
java·数据库·redis