Spring Boot实现文件上传与OSS集成:从基础到应用

目录

  • 前言
  • 1. 文件上传的基础实现
    • 1.1 前端文件上传请求
    • 1.2 后端文件接收与保存
  • 2. 集成第三方OSS服务
    • 2.1 准备工作
    • 2.2 编写OSS集成代码
    • 2.3 修改Controller实现文件上传至OSS
  • 3. 文件上传的扩展:多文件上传与权限控制
  • 结语

前言

随着互联网应用的快速发展,文件上传已成为各类应用的重要功能之一。本文将基于Spring Boot实现文件上传的基础功能,并探讨如何将文件上传服务集成至第三方OSS(如阿里云OSS、华为云OBS等),以提升应用的文件存储能力。我们将以具体的示例代码为切入点,从前端文件上传、后端文件接收与存储、到OSS集成提供详细说明,帮助开发者快速掌握文件上传的开发要点。

1. 文件上传的基础实现

文件上传是现代Web开发中常见的需求。通过MultipartFile类,Spring Boot支持多种文件类型的接收和处理。在此,我们首先实现文件上传的基础功能,包括前端发送文件、后端接收并存储至本地文件系统。
在这里插入图片描述

1.1 前端文件上传请求

前端通过<form>表单提交文件,并设置enctype属性为multipart/form-data。这样可以确保文件以合适的格式传输给服务器。以下是前端表单的示例代码:

<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"/><button type="submit">上传文件</button>
</form>

在这里,我们使用POST方法将文件上传至/upload路径,并确保数据类型为multipart/form-data。用户选择文件后,表单将自动将文件数据与表单数据打包并提交给服务器。

1.2 后端文件接收与保存

在后端,使用@RestController@PostMapping注解定义一个/upload接口,用于接收和处理前端上传的文件。Spring Boot的MultipartFile类提供了一些方便的方法,如getOriginalFilename()用于获取原始文件名,transferTo()用于保存文件。

以下是文件上传的Controller代码:

@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {// 获取原始文件名String originalFilename = file.getOriginalFilename();// 生成唯一文件名,防止文件重名String filename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 将文件存储到本地目录file.transferTo(new File("D:\\temp\\files\\" + filename));// 返回文件访问URL或成功信息return Result.success("文件上传成功,访问路径为:url地址.../" + filename);}
}

在此代码中,我们:

  • 获取了原始文件名,并通过UUID生成唯一文件名,避免重名文件的覆盖。
  • 使用file.transferTo()方法将文件存储到指定目录。
  • 返回结果信息,其中可以包含上传文件的访问URL(假设文件已通过Web服务器对外提供访问)。

2. 集成第三方OSS服务

存储文件到本地虽然简单,但在高访问量或大文件场景中,本地存储可能存在扩展性、存储容量、安全性等方面的限制。因此,将文件存储至第三方OSS(如阿里云OSS、华为云OBS等)是一种更为合理的选择。第三方云存储提供稳定的存储服务、CDN加速、权限管理等功能,适合互联网应用。
在这里插入图片描述

2.1 准备工作

为了集成OSS服务,我们需要根据官方文档获取相关SDK,并完成账户授权等配置。以下步骤以阿里云OSS为例:

  1. 引入SDK依赖:在Maven或Gradle配置中添加阿里云OSS SDK的依赖。

    <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>
    </dependency>
    
  2. 配置OSS信息:在配置文件application.ymlapplication.properties中添加OSS的配置信息,包括accessKeyIdaccessKeySecretbucketNameendpoint

    oss:endpoint: http://oss-cn-hangzhou.aliyuncs.comaccessKeyId: yourAccessKeyIdaccessKeySecret: yourAccessKeySecretbucketName: yourBucketName
    

2.2 编写OSS集成代码

在配置完必要的依赖和参数后,我们创建一个OssService类,用于封装文件上传至OSS的逻辑:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.io.InputStream;
import java.util.UUID;@Service
public class OssService {@Value("${oss.endpoint}")private String endpoint;@Value("${oss.accessKeyId}")private String accessKeyId;@Value("${oss.accessKeySecret}")private String accessKeySecret;@Value("${oss.bucketName}")private String bucketName;public String uploadFileToOss(InputStream inputStream, String originalFilename) {// 创建OSSClient实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 生成唯一文件名String filename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 上传文件ossClient.putObject(bucketName, filename, inputStream);// 返回文件的URLreturn "https://" + bucketName + "." + endpoint + "/" + filename;} finally {// 关闭OSSClientossClient.shutdown();}}
}

此类中,我们使用OSSClient将文件上传至OSS,并生成一个唯一的文件名。uploadFileToOss()方法返回文件的访问URL,便于后续使用。

2.3 修改Controller实现文件上传至OSS

FileUploadController中注入OssService,并使用其方法上传文件至OSS。以下是修改后的代码:

@RestController
public class FileUploadController {private final OssService ossService;public FileUploadController(OssService ossService) {this.ossService = ossService;}@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {// 将文件上传至OSS,并获取文件访问URLString url = ossService.uploadFileToOss(file.getInputStream(), file.getOriginalFilename());// 返回OSS的URLreturn Result.success("文件上传成功,访问路径为:" + url);}
}

3. 文件上传的扩展:多文件上传与权限控制

在实际应用中,文件上传可能涉及多文件上传和权限控制等扩展功能。以下是一些典型需求:

  • 多文件上传:可以通过在Controller中接收MultipartFile[]数组实现多文件上传,循环处理数组中的每个文件。
  • 权限控制:根据OSS服务的权限策略,配置文件访问的公开或私有权限。例如,阿里云OSS允许通过设置Bucket的权限控制公开、私有或指定访问者。

结语

本文介绍了Spring Boot中实现文件上传的基础步骤,包括如何在前端发送文件、后端接收并存储文件。同时,展示了如何将文件存储服务集成至第三方OSS,提升系统的扩展性与安全性。在实际开发中,还可以根据业务需求增加权限控制、多文件处理等功能。希望本文的讲解能够为读者提供清晰的指导,帮助更好地实现文件上传功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471149.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务各组件整合

nacos 第一步&#xff0c;引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> 第二步&#xff0c;增加配置 spring:application:name: …

机器学习总结

机器学习按照模型类型分为监督学习模型&#xff0c;无监督学习模型和概率模型三大类&#xff1a; 下图是机器学习笔记思维导图&#xff0c;&#xff1a; 一.什么是机器学习 从本质上讲&#xff0c;可以认为机器学习就是在数据中寻找一种合适的函数来描述输入与输出之间的关系。…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

三、损失函数

损失函数 前言一、分类问题的损失函数1.1 二分类损失函数1.1.1 数学定义1.1.2 函数解释&#xff1a;1.1.3 性质1.1.4 计算演示1.1.5 代码演示 1.2 多分类损失函数1.1.1 数学定义1.1.2 性质与特点1.1.3 计算演示1.1.4 代码演示 二、回归问题的损失函数2.1 MAE损失2.2 MSE损失2.3…

PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸

小编最近有一篇png图片要批量压缩&#xff0c;大小都在5MB之上&#xff0c;在网上找了半天要么就是有广告&#xff0c;要么就是有毒&#xff0c;要么就是功能复杂&#xff0c;整的我心烦意乱。 于是我自己用python写了一个纯净工具&#xff0c;只能压缩png图片&#xff0c;没任…

测试工程师简历「精选篇」

【#测试工程师简历#】一份专业且引人注目的测试工程师简历&#xff0c;无疑是你敲开理想职位大门的金钥匙。那么&#xff0c;如何撰写一份既体现技术水平又彰显个人特色的简历呢&#xff1f;以下是幻主简历网整理的测试工程师简历「程序员篇」&#xff0c;欢迎大家阅读收藏&…

git下载慢下载不了?Git国内国外下载地址镜像,git安装视频教程

git安装下载的视频教程在这 3分钟完成git下载和安装&#xff0c;git国内外下载地址镜像&#xff0c;Windows为例_哔哩哔哩_bilibili 一、Git安装包国内和国外下载地址镜像 1.1国外官方下载地址 打开Git的官方网站&#xff1a;Git官网下载页面。在页面上选择对应的系统&…

专题十八_动态规划_斐波那契数列模型_路径问题_算法专题详细总结

目录 动态规划 动态规范五步走&#xff1a; 1. 第 N 个泰波那契数&#xff08;easy&#xff09; 解析&#xff1a; 1.状态表达式&#xff1a; 2.状态转移方程&#xff1a; 3.初始化&#xff1a; 4.填表顺序&#xff1a; 5.返回值 编写代码&#xff1a; 总结&#xff…

阿里云centos7.9服务器磁盘挂载,切换服务路径

项目背景 1、项目使用的服务器为阿里云centos7.9&#xff0c;默认的磁盘为vda&#xff0c;文件系统挂载在这个磁盘上&#xff0c;项目上使用的文件夹为/home/hnst/uploadPath 2、vda使用率已达到91% 3、现购置一块新的磁盘为vdb&#xff0c;大小为2T 目的 切换服务所使用的…

STM32问题集

这里写目录标题 一、烧录1、 Can not connect to target!【ST-LINK烧录】 一、烧录 1、 Can not connect to target!【ST-LINK烧录】 烧录突然 If the target is in low power mode, please enable “Debug in Low Power mode” option from Target->settings menu 然后就&…

Scala学习记录,case class,迭代器

case class case class创建的对象的属性是不可改的 创建对象&#xff0c;可以不用写new 自动重写&#xff1a;toString, equals, hashCode, copy 自动重写方法&#xff1a;toString,equals,hashCode,copy 小习一下 1.case class 的定义语法是什么 基本形式&#xff1a;case …

成都睿明智科技有限公司解锁抖音电商新玩法

在这个短视频风起云涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家争夺的流量高地。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司犹如一颗璀璨的新星&#xff0c;以其专业的抖音电商服务&#xff0c;助力无数品牌实现从零…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势

目录 文献基本信息 序言 1 发展概况 2 重点技术发展 2.1 人工智能技术 2.1.1 应用深化 2.1.2 作战效能提升 2.2 航空技术 2.2.1螺旋桨设计创新 2.2.2 发射回收技术进步 2.3 其他相关技术 2.3.1 远程控制技术探 2.3.2 云地控制平台应用 3 装备系统进展 3.1 无人作…

LeetCode 86.分隔链表

题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 思路&#xff1a; 代码&#xff1a; /*** Definiti…

SystemVerilog学习笔记(六):控制流

条件语句 条件语句用于检查块中的语句是否被执行。条件语句创建语句块。如果给出的表达式是 true&#xff0c;执行块中的语句集&#xff0c;如果表达式为 false&#xff0c;则 else 块语句将最后执行。 序号条件语句1.if2.if-else3.if-else ladder4.unique if5.unique0 if6.p…

SQL,力扣题目1127, 用户购买平台

一、力扣链接 LeetCode_1127 二、题目描述 支出表: Spending ---------------------- | Column Name | Type | ---------------------- | user_id | int | | spend_date | date | | platform | enum | | amount | int | ------------------…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理&#xff0c;请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注&#xff1a;本文基于《计算机网络》&#xff08;第5版&#xff09;吴功宜、吴英…

群控系统服务端开发模式-应用开发-前端个人信息功能

个人信息功能我把他分为了3部分&#xff1a;第一部分是展示登录者信息&#xff1b;第二步就是登录者登录退出信息&#xff1b;第三部分就是修改个人资料。 一、展示登录者信息 1、优先添加固定路由 在根目录下src文件夹下route文件夹下index.js文件中&#xff0c;添加如下代码 …

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

Java面向对象高级2

1.代码块 2.内部类 成员内部类 public class Demo{public static void main(String[] args) {outer.inner innew outer().new inner();in.run();}}class outer{private String str"outer";public class inner{public void run(){String sstr;System.out.println(s);…