山东大学软件学院项目实训-基于大模型的模拟面试系统-个人主页头像上传

采用图床的方案,存储用户头像。

实现步骤

引入OSS依赖

在我们的SpringBoot项目中引入OSS依赖

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

配置 OSSClient

java 复制代码
package com.sdumagicode.backend.config;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import io.github.cdimascio.dotenv.Dotenv;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class OSSUploadConfig {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String maxSize;
    private String prefix;

    public OSSUploadConfig() {
        Dotenv dotenv = Dotenv.configure().load();
        this.endpoint = dotenv.get("ALIYUN_OSS_ENDPOINT");
        this.accessKeyId = dotenv.get("ALIYUN_OSS_ACCESS_KEY_ID");
        this.accessKeySecret = dotenv.get("ALIYUN_OSS_ACCESS_KEY_SECRET");
        this.bucketName = dotenv.get("ALIYUN_OSS_BUCKET_NAME");
        this.maxSize = dotenv.get("ALIYUN_OSS_MAX_SIZE");
        this.prefix = dotenv.get("ALIYUN_OSS_DIR_PREFIX");
    }

    @Bean
    public OSSClient createOssClient() {
        return (OSSClient) new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

配置信息在.env文件里:

java 复制代码
# .env 文件(注意:不要加引号)
ALIYUN_OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com
ALIYUN_OSS_ACCESS_KEY_ID=your-access-key-id
ALIYUN_OSS_ACCESS_KEY_SECRET=your-access-key-secret
ALIYUN_OSS_BUCKET_NAME=your-bucket-name
ALIYUN_OSS_MAX_SIZE=10MB
ALIYUN_OSS_DIR_PREFIX=uploads/

因为Spring Boot 默认不直接支持 .env 文件,所以需要使用 dotenv 库来加载它。

cpp 复制代码
<dependency>
    <groupId>io.github.cdimascio</groupId>
    <artifactId>dotenv-java</artifactId>
    <version>3.0.0</version>
</dependency>

完成上述代码后,我们就可以在其他类中上传图片到阿里云图床了。

调用实例

首先,根据前端传来的是一个base64编码的图片,于是定义了一个工具类专门处理该图片并将其上传到阿里云图床。

java 复制代码
package com.sdumagicode.backend.util;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.PutObjectRequest;
import com.sdumagicode.backend.config.OSSUploadConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayInputStream;
import java.util.Base64;
import java.util.UUID;

@Service
public class OSSUpload {
    private final OSSClient ossClient;
    private final OSSUploadConfig ossConfig;

    @Autowired
    public OSSUpload(OSSClient ossClient, OSSUploadConfig ossConfig) {
        this.ossClient = ossClient;
        this.ossConfig = ossConfig;
    }

    public String uploadBase64ToOSS(String base64Data, String folder) {
        try {
            // 1. 检查 Base64 数据
            if (base64Data == null || !base64Data.startsWith("data:image/")) {
                throw new IllegalArgumentException("Base64 数据格式不正确");
            }

            // 2. 解析 Base64
            String[] parts = base64Data.split(",");
            String header = parts[0]; // data:image/png;base64
            String data = parts[1];   // 实际数据

            // 3. 获取文件扩展名
            String extension = header.split(";")[0].split("/")[1];

            // 4. 生成唯一文件名
            String fileName = folder + UUID.randomUUID() + "." + extension;

            // 5. 解码并上传
            byte[] bytes = Base64.getDecoder().decode(data);
            ossClient.putObject(
                    ossConfig.getBucketName(),
                    fileName,
                    new ByteArrayInputStream(bytes)
            );

            // 6. 返回访问 URL
            return "https://" + ossConfig.getBucketName() + "." + ossConfig.getEndpoint() + "/" + fileName;
        } catch (Exception e) {
            throw new RuntimeException("上传图片到 OSS 失败: " + e.getMessage(), e);
        }
    }
}

之后,修改UserServiceImpl.java文件里保存图片URL的部分:

java 复制代码
@Autowired
private OSSUpload ossUpload;

...

if (FileDataType.BASE64.equals(user.getAvatarType())) {
    // 1. 上传Base64图片到OSS
    String ossUrl = ossUpload.uploadBase64ToOSS(user.getAvatarUrl(), "avatars/");
    // 2. 更新用户信息
    user.setAvatarUrl(ossUrl);
    user.setAvatarType("0"); // 假设"0"表示URL类型
}

图片成功上传到阿里云,并且可以在用户端正常显示。

遇到的问题

dotenv版本不匹配

java 复制代码
java: cannot access io.github.cdimascio.dotenv.Dotenv
  bad class file: /Users/leeson/.m2/repository/io/github/cdimascio/dotenv-java/3.0.0/dotenv-java-3.0.0.jar!/io/github/cdimascio/dotenv/Dotenv.class
    class file has wrong version 55.0, should be 52.0
    Please remove or make sure it appears in the correct subdirectory of the classpath.

这个错误是因为 Java 版本不兼容.class 文件的版本 55.0 对应 Java 11 ,而项目使用的是 Java 8 (版本 52.0),导致无法加载该类。

解决方案

降级 dotenv-java(兼容 Java 8)

xml 复制代码
<dependency>
    <groupId>io.github.cdimascio</groupId>
    <artifactId>dotenv-java</artifactId>
    <version>2.3.2</version> <!-- 支持 Java 8 的版本 -->
</dependency>

修改之后,项目成功地跑了起来。

相关推荐
guodingdingh1 小时前
软件开发工作问题总结0718
java·开发语言·数据库
daols882 小时前
vxe-table 渲染器教程一:实现金额输入控件
javascript·vue.js·vxe-table
咖啡八杯3 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
不好听6133 小时前
React vs Vue:两大前端框架技术选型深度对比
前端·vue.js·react.js
优橙教育3 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程