Spring Boot中实现图片上传功能的两种策略

🌟 前言

欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

文章目录

  • [Spring Boot中实现图片上传功能的两种策略](#Spring Boot中实现图片上传功能的两种策略)
    • 摘要
    • [1. 保存到阿里云OSS](#1. 保存到阿里云OSS)
      • [1.1 依赖添加](#1.1 依赖添加)
      • [1.2 配置OSS客户端](#1.2 配置OSS客户端)
      • [1.3 控制层实现](#1.3 控制层实现)
    • [2. 保存到本地文件系统](#2. 保存到本地文件系统)
      • [2.1 控制层实现](#2.1 控制层实现)
    • [🎉 结语](#🎉 结语)

Spring Boot中实现图片上传功能的两种策略

摘要

在现代Web应用程序中,图片上传是一个常见的功能。本文将介绍如何在Spring Boot项目中实现图片上传,包括将图片保存到阿里云OSS和本地文件系统两种方法。我们将通过代码示例和详细注释,帮助读者理解这两种方法的实现过程。

1. 保存到阿里云OSS

1.1 依赖添加

首先,我们需要在项目的pom.xml文件中添加阿里云OSS的SDK依赖,以及用于文件操作的commons-iocommons-beanutils库。

xml 复制代码
<!-- 阿里云OSS SDK -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.16.1</version>
</dependency>
<!-- 文件操作工具类 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

1.2 配置OSS客户端

创建一个工具类uploadUtil,用于配置OSS客户端并实现图片上传功能。我们需要设置OSS的域名、访问密钥ID和密钥,以及OSS的地域节点。

java 复制代码
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

public class UploadUtil {
    // OSS域名,注意替换为实际的域名
    public static final String ALI_DOMAIN = "https://czh123-text.oss-cn-guangzhou.aliyuncs.com";
    
    // 上传图片到OSS的方法
    public static String uploadImage(MultipartFile file) throws IOException {
        // 获取原始文件名和扩展名
        String originalFilename = file.getOriginalFilename();
        String ext = "." + FilenameUtils.getExtension(originalFilename);
        // 生成新的文件名,包含UUID以避免重名
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String fileName = uuid + ext;
        
        // OSS配置信息
        String endpoint = "http://oss-cn-guangzhou.aliyuncs.com"; // 地域节点
        String accessKeyId = "LTAI5tGOUpuc5EwDcJ9"; // 访问密钥ID
        String accessKeySecret = "fYy0DdFrrFBwky"; // 访问密钥Secret
        
        // 创建OSS客户端
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传文件到OSS
        ossClient.putObject("czh123-text", fileName, file.getInputStream());
        // 关闭客户端
        ossClient.shutdown();
        // 返回图片的URL
        return ALI_DOMAIN + fileName;
    }
}

1.3 控制层实现

在控制器中,我们创建一个upImg方法,用于处理图片上传请求。该方法调用uploadUtil类中的uploadImage方法,并返回图片的URL。

java 复制代码
@PostMapping("/upImg")
public String upImg(MultipartFile file) throws IOException {
    return UploadUtil.uploadImage(file);
}

2. 保存到本地文件系统

2.1 控制层实现

另一种方法是将图片保存到本地文件系统。在控制器中,我们创建一个upload方法,用于处理上传请求并将图片保存到指定的本地目录。

java 复制代码
@PostMapping("/upload")
public String upload(MultipartFile file) {
    if (file.isEmpty()) {
        return "图片为空";
    }
    // 获取原始文件名和扩展名
    String originalFilename = file.getOriginalFilename();
    String fileNamePrefix = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
    String fileNameSuffix = "." + originalFilename.split("\\.")[1];
    // 生成新的文件名
    String fileName = fileNamePrefix + fileNameSuffix;
    
    // 获取项目根目录的绝对路径
    ApplicationHome applicationHome = new ApplicationHome(this.getClass());
    String pre = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath() +
            "/src/main/resources/static/images/";
    String path = pre + fileName;
    
    try {
        // 将上传的文件保存到本地
        file.transferTo(new File(path));
        // 返回文件的本地路径
        return path;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "图片上传失败";
}

🎉 结语

本文介绍了在Spring Boot项目中实现图片上传的两种方法:保存到阿里云OSS和保存到本地文件系统。通过这两种方法,开发者可以根据项目需求和资源情况选择合适的图片存储策略。阿里云OSS提供了高可用性和扩展性,适合需要远程访问和高并发的场景;而本地文件系统则适合小型项目或对数据安全性要求不高的场景。在实际开发中,开发者应根据实际情况灵活选择。

感谢你的访问,期待与你在技术的道路上相遇!👋🌟🚀

相关推荐
小_太_阳3 分钟前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾6 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
黑胡子大叔的小屋24 分钟前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark26 分钟前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
星就前端叭1 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
计算机毕设孵化场1 小时前
计算机毕设-基于springboot的校园社交平台的设计与实现(附源码+lw+ppt+开题报告)
spring boot·课程设计·计算机毕设论文·计算机毕设ppt·计算机毕业设计选题推荐·计算机选题推荐·校园社交平台
雷神乐乐1 小时前
Spring学习(一)——Sping-XML
java·学习·spring
苹果醋32 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者2 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu