Springboot集成阿里云OSS实现图片上传功能

1.注册阿里云账户,注册完成后实名认证   aliyun.com

2.开通OSS云服务

3.进入阿里云对象存储控制台

4.新建Bucket,权限控制中关闭阻止公共访问

5.配置AccessKey,个人中心创建AccessKey,选择云空间创建,保存好ID和Secret

6.通过配置环境变量完成ID和Secret的配置(可选,如果不配置的话可以在项目代码中配置)

7.回到控制台找到SDK,查看相关语言的JDK文档,项目中引入依赖。

8.复制Demo程序修改相关配置后测试

 

代码:

使用Java 9及以上版本,需要添加以下JAXB相关依赖。

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

 

# OSS配置
oss:
  endpoint: https://oss-cn-hangzhou.aliyuncs.com
  access-key-id: 自己的ID
  access-key-secret: 自己的secret
  region: cn-hangzhou
  bucket-name: bucket的名称
package com.heima.utils;

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;

/**
 * 阿里云OSS上传工具类
 */
@Slf4j
@Component
public class OssUtils {

    // OSS配置信息(从配置文件注入)
    @Value("${oss.endpoint:https://oss-cn-hangzhou.aliyuncs.com}")
    private String endpoint;
    
    @Value("${oss.access-key-id:自己的ID}")
    private String accessKeyId;
    
    @Value("${oss.access-key-secret:自己的secret}")
    private String accessKeySecret;
    
    @Value("${oss.region:cn-hangzhou}")
    private String region;
    
    @Value("${oss.bucket-name:自己的bucket名称}")
    private String bucketName;

    /**
     * 上传文件到OSS
     *
     * @param bucketName  Bucket名称
     * @param objectName  Object完整路径(不能包含Bucket名称)
     * @param inputStream 要上传的文件流
     * @return 上传结果,成功返回true,失败返回false
     */
    private boolean uploadFile(String bucketName, String objectName, InputStream inputStream) {
        if (inputStream == null) {
            log.error("文件流为空");
            return false;
        }

        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

        OSS ossClient = null;
        try {
            // 创建OSSClient实例
            ossClient = OSSClientBuilder.create()
                    .endpoint(endpoint)
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region(region)
                    .build();

            // 创建PutObjectRequest对象
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);

            // 上传文件
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            log.info("文件上传成功: bucket={}, object={}, requestId={}", 
                    bucketName, objectName, result.getRequestId());
            return true;
        } catch (Exception e) {
            log.error("文件上传失败: bucket={}, object={}", bucketName, objectName, e);
            return false;
        } finally {
            // 释放资源
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * 上传文件到OSS(带前缀,通过InputStream)
     *
     * @param prefix      文件前缀路径(例如:uploads/images/)
     * @param fileName    文件名
     * @param inputStream 要上传的文件流
     * @return OSS访问URL,失败返回null
     */
    public String uploadFileWithInputStream(String prefix, String fileName, InputStream inputStream) {
        if (!prefix.endsWith("/")) {
            prefix = prefix + "/";
        }
        String objectName = prefix + fileName;
        boolean success = uploadFile(bucketName, objectName, inputStream);
        if (success) {
            return String.format("https://%s.%s/%s", bucketName, endpoint.replace("https://", ""), objectName);
        }
        return null;
    }


}
接口调用:
/**
* 上传文件到OSS(不保存到服务器) * * @param file 上传的文件 * @return 统一返回结果,包含文件访问URL */ @PostMapping("/fileUpload") public String upload(@RequestParam("fileName") MultipartFile file) throws IOException { log.info("开始上传文件到OSS,文件名:{}", file.getOriginalFilename()); // 获取原始文件名 String originalFilename = file.getOriginalFilename(); // 生成唯一文件名:UUID + 原始文件扩展名 String extension = ""; if (originalFilename != null && originalFilename.contains(".")) { extension = originalFilename.substring(originalFilename.lastIndexOf(".")); } String newFileName = UUID.randomUUID().toString() + extension; try { // 直接通过InputStream上传到OSS,不保存到服务器 String fileUrl = ossUtils.uploadFileWithInputStream( "lkdImgs/", // 前缀路径 newFileName, file.getInputStream() ); if (fileUrl != null) { log.info("文件上传成功,URL:{}", fileUrl); return fileUrl; } else { log.error("文件上传失败"); return "文件上传失败"; } } catch (Exception e) { log.error("文件上传异常", e); return "文件上传失败:" + e.getMessage(); } }

 

posted @ 2026-06-06 10:47  1998青年  阅读(13)  评论(0)    收藏  举报