springboot实现文件上传和读取

news2024/12/26 1:50:04

一.本地存储(将图片存放在本地的nginx服务器上)

  1. nginx上创建images目录,用来存储上传的文件

    (使用nginx的好处是暴露端口,便于外界访问,同时nginx作为静态资源服务器在处理静态资源方面更快)

    不然你访问文件就需要通过文件输入输出流进行输出

  2. 使用MultipartFile类提供的API方法,把临时文件转存到本地磁盘目录下

    MultipartFile 常见方法:

    • String getOriginalFilename(); //获取原始文件名
    • void transferTo(File dest); //将接收的文件转存到磁盘文件中
    • long getSize(); //获取文件的大小,单位:字节
    • byte[] getBytes(); //获取文件内容的字节数组
    • InputStream getInputStream(); //获取接收到的文件内容的输入流

下面来看一个案例:上传一个图片并返回图片存储的地址

注:前端上传文件要用表单参数,所以文档中的参数格式不再是applicant/json,multipart/form-data。而是后端接收表单参数与接收query参数一样,都用@Requestparam。

image-20221227211742547

  • 基本信息

    请求路径:/upload
    
    请求方式:POST
    
    接口描述:上传图片接口
    
  • 请求参数

    参数格式:multipart/form-data

    参数说明:

    参数名称参数类型是否必须示例备注
    imagefile
  • 响应数据

    参数格式:application/json

    参数说明:

    参数名类型是否必须备注
    codenumber必须响应码,1 代表成功,0 代表失败
    msgstring非必须提示信息
    dataobject非必须返回的数据,上传图片的访问路径

    响应数据样例:

    {
        "code": 1,
        "msg": "success",
        "data": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-0400.jpg"
    }
    

代码:

@Slf4j
@RestController
public class UploadController {

    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传:{},{},{}",username,age,image);

        //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //构建新的文件名
        String extname = originalFilename.substring(originalFilename.lastIndexOf("."));//文件扩展名
        String newFileName = UUID.randomUUID().toString()+extname;//随机名+文件扩展名

        //将文件存储在服务器的nginx目录下,这里是随便写的地址
        image.transferTo(new File("E:/images/"+newFileName));

        return Result.success();
    }

}

注:在SpringBoot中,文件上传时默认单个文件最大大小为1M,我们再次上传一个较大的文件(超出1M)时发现,后端程序报错。

那么如果需要上传大文件,可以在application.properties进行如下配置:

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

二.使用阿里云OSS

1.什么是云服务

云服务指的就是通过互联网对外提供的各种各样的服务,比如像:语音服务、短信服务、邮件服务、视频直播服务、文字识别服务、对象存储服务等等。

当我们在项目开发时需要用到某个或某些服务,就不需要自己来开发了,可以直接使用阿里云提供好的这些现成服务接口就可以了。

比如:在项目开发当中,我们要实现一个短信发送的功能,如果我们自己实现,会很繁琐,因为你需要和各个运营商进行对接。而此时阿里云完成了和三大运营商对接,并对外提供了一个短信服务。只需要调用阿里云提供的短信服务,就可以很方便的来发送短信了。

简单说就是别人帮我们实现好了功能,我们只要调用接口即可。当然云服务提供商给我们提供的软件服务是需要收取一部分费用的。

2.什么是阿里云OSS

阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

在前端进行文件上传并请求到服务端时,在服务器本地磁盘当中就不需要再来存储文件了。我们直接将接收到的文件上传到oss,由 oss帮我们存储和管理。同时安全性还得到提高。

3.怎么使用阿里云OSS

无论使用什么样的云服务,阿里云也好,腾讯云、华为云也罢,在使用第三方的服务时,操作的思路都是一样的。

image-20221229093911113

SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。

简单说,sdk中包含了我们使用第三方云服务时所需要的依赖,以及一些示例代码。我们可以参照sdk所提供的示例代码就可以完成入门程序。

接下来我们就来介绍一下我们当前要使用的阿里云oss对象存储服务具体的使用步骤。

3.1 准备

image-20221229112451120

Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。

下面我们根据之前介绍的使用步骤,完成准备工作:

  1. (1)打开https://www.aliyun.com/ ,申请阿里云账号并完成实名认证。

    image-20221128012526497

    (2)充值 (可以不用做)

    (3)开通OSS

    登录阿里云官网。 点击右上角的控制台。

    image-20221129214250389

    将鼠标移至产品,找到并单击对象存储OSS,打开OSS产品详情页面。在OSS产品详情页中的单击立即开通。

    image-20221129214332892

    image-20221129214403131

    image-20221128012258544

    开通服务后,在OSS产品详情页面单击管理控制台直接进入OSS管理控制台界面。您也可以单击位于官网首页右上方菜单栏的控制台,进入阿里云管理控制台首页,然后单击左侧的对象存储OSS菜单进入OSS管理控制台界面。

    image-20201126234535040

    (4)创建存储空间

    新建Bucket,命名为你想要的名字 ,读写权限为 公共读(这样外界才能读取图片)。

    image-20221128014414947

3.2 入门

阿里云oss 对象存储服务的准备工作我们已经完成了,接下来我们就来完成第二步操作:参照官方所提供的sdk示例来编写入门程序。

官方文档:https://help.aliyun.com/zh/oss/developer-reference/java-installation

这里我们已经写好了阿里云操作相关的工具类。

【1】引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

【2】引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component
public class AliOSSUtils {
    private String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
    private String accessKeyId = "";
    private String accessKeySecret = "";
    private String bucketName = "web-framework01";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile multipartFile) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = multipartFile.getInputStream();

        // 避免文件覆盖
        String originalFilename = multipartFile.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;

        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

上面变量的值需要根据自己的实际情况进行配置

【1】endpoint是指你创建的bucket的地域节点,点击对象存储OSS,再点击Bucket列表,选择你的bucket,点击概览就可以在下面看到,注意复制外网访问的地域节点,因为我们存取都是在外网操作的。

【2】bucketName就是要填写你的创造的存储空间bucket的名称。后面bucketName会接在endpoint前面,形成Bucket域名,通过访问域名存取文件。

YJHW_S2O%01R7$UW06PC4EO

【3】accessKeyId和accessKeySecret就是你的密钥了。获取方式如下

image-20221128020105943

3.3 集成使用

现在我们就可以使用工具类来实现文件的存储。

文件上传的基本逻辑就是将图片上传到阿里云OSS,然后在数据库中存储图片对应的image的url地址。
而取图片的基本逻辑就是根据要取得图片的信息去得到对应的url,然后把url发送给前端。

例子:实现学生请假功能,并且学生能查看之前他请假的详情

(1)对应的开发文档

POST /leaves

学生请假

Body 请求参数

courseId: 课程id
leavePlace: 去哪里
appealBeginTime: 课程开始时间
appealEndTime: 课程结束时间
reason: 原因
status: 状态
leaveImage: string

注:下面的参数除了Authorization的表头参数之外,其他都是表单参数

image1

名称位置类型必选说明
Authorizationheaderstringnone
bodybodyobjectnone
» courseIdbodyintegernone
» leavePlacebodystringnone
» appealBeginTimebodystring2023-10-27T15:50:00
» appealEndTimebodystring2023-10-27T15:50:00
» reasonbodystringnone
» statusbodystring0为未通过,1为通过,2为不通过,传0,到我这都会改成0
» leaveImagebodystring(binary)请假图片

返回示例

{
  "code": 1,
  "msg": "success",
  "data": null
}

(2)实现代码

    @PreAuthorize("hasAuthority('sys:student:operation')")
    @PostMapping("")
    @ApiOperation("学生请假")
    public Result addLeave(@RequestHeader String Authorization, 
                           @RequestParam Integer courseId, @RequestParam String leavePlace,
                           @RequestParam @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") LocalDateTime appealBeginTime,
                           @RequestParam @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") LocalDateTime appealEndTime, 
                           @RequestParam String reason,
                           @RequestParam String status, 
                           @RequestParam MultipartFile leaveImage) throws IOException {
        //封装其他数据,这部分不用管
        Claims claims = JwtUtil.parseJwt(Authorization);
        Integer userid = Integer.parseInt(claims.getSubject());
        Map<String, Object> studentInfo = studentService.getStudentInfoByUserId(userid);
        Integer studentId = (Integer) studentInfo.get("id");
        status="0";
        LeaveApplication leaveApplication=new LeaveApplication(null,null,courseId,reason,leavePlace,appealBeginTime,appealEndTime,status,null);
        //调用阿里云OSS工具类,将上传上来的文件存入阿里云,并将url赋值给enity类
        String url = aliOSSUtils.upload(leaveImage);
        leaveApplication.setImage(url);
        //调用service层方法像数据库添加封装好的数据
        leaveService.addLeave(leaveApplication);
        return Result.success();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android 13/14高版本SurfaceFlinger出现VSYNC-app/VSYNC-appSf/VSYNC-sf剖析

问题背景&#xff1a; 了解surfaceflinger的vsync同学都可能知道vsync属于一个节拍器&#xff0c;主要用来控制有节奏的渲染&#xff0c;不至于会产生什么画面撕裂等现象。 一般vsync都有会有2部分&#xff1a; app部分vsync&#xff0c;控制各个app可以有节奏的上帧 surfacef…

FPGA project : sdram

sdram读写控制器 实验目标&#xff1a; 设计并实现一个 SDRAM 数据读写控制器&#xff0c;使用 PC 机通过串口向 SDRAM 写入 10 字 节数据&#xff0c;并将写入的 10 字节数据读出&#xff0c;通过串口回传至 PC 机&#xff0c;在串口助手上位机上打印 显示回传数据。 框图设…

towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本

towxml的使用&#xff0c;在微信小程序中快速将markdown格式渲染为wxml文本 Towxml概述安装下载 Towxml在小程序中使用 towxml Towxml概述 towxml3.0 支持以下功能&#xff1a; ● echarts图表&#xff0c;默认禁用&#xff0c;需自行构建以开启此功能 ● LaTeX数学公式&#…

3D视觉硬件技术

目前市面上主流的3D光学视觉方案有三种&#xff1a; 双目立体视觉法&#xff08;Stereo Vision&#xff0c;在下文称双目法&#xff09;&#xff0c;结构光法&#xff08;Structured Light&#xff0c;在下文称结构光&#xff09;以及飞行时间法(Time of Flight, ToF在下文称T…

Java日志系统之Logback

目录 Logback Logback的简单使用 Logback配置文件 log4j.peoperties转化为logback.xml Logback Logback的性能要比log4j要好。 Logback分为三个模块&#xff1a; logback-core&#xff1a;其他两个模块的基础模块logback-classic&#xff1a;它是log4j的一个改良版本&am…

【网络协议】聊聊ICMP与ping是如何测试网络联通性

ICMP协议格式 ping是基于iCMP协议工作的&#xff0c;ICMP全称Internet Control Message Protocol&#xff0c;就是互联网控制报文协议。其实就是有点类似于古代行军打仗&#xff0c;哨探进行前方探明具体情况。 IMCP本身处于网络层&#xff0c;将报文封装在IP包里&#xff0c;…

AYIT嵌入式实验室2023级C语言训练1-4章训练题

文章目录 前言1. 判断闰年2.(ab-c)*d的计算问题3.计算三角形的周长和面积4.牛牛的等差数列5.判断字母6.网购7. 牛牛的通勤8.获得月份天数9.大小写转换10.KiKi说祝福语11.小乐乐求和12.奇偶统计13.KiKi求质数个数14.乘法表15.牛牛学数列16.牛牛学数列217.数位之和18.魔法数字变换…

Android---OkHttp详解

OkHttp 是一套处理 HTTP 网络请求的依赖库&#xff0c;由 Square 公司设计研发并开源&#xff0c;目前可以在 Java 和 Kotlin 中使用。对于 Android App&#xff0c;OkHttp 现在几乎已经占据了所有的网络请求操作。RetroFit OkHttp 实现网络请求似乎成了一种标配。 因此&…

【每日一题】—— 最大素因子

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

基于springboot实现4S店车辆管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现4S店车辆管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

PC性能监测工具,您不可或缺的好帮手

前言 在计算机使用过程中&#xff0c;常有人会问&#xff1a;为什么我的CPU利用率接近100%&#xff1f;为什么可用内存不断减少&#xff1f; 幸运的是&#xff0c;Windows性能工具包为我们提供了帮助。是什么应用程序的锅&#xff0c;我们使用该性能工具一探究竟。 一、 Win…

国内在线协作工具有哪些?

随着信息技术的快速发展和互联网的普及&#xff0c;在线协作工具成为了现代团队和企业不可或缺的一部分。国内市场上涌现出许多优秀的在线协作工具&#xff0c;为团队协作提供了高效、便捷的解决方案。 在本文中&#xff0c;我们将向大家推荐3款国内备受赞誉的在线协作工具&…

[NSSRound#13 Basic] 刷题记录

文章目录 [NSSRound#13 Basic]flask?jwt?[NSSRound#13 Basic]ez_factors[NSSRound#13 Basic]flask?jwt?(hard)[NSSRound#13 Basic]信息收集[NSSRound#13 Basic]MyWeb [NSSRound#13 Basic]flask?jwt? 考点&#xff1a;session伪造 打开题目&#xff0c;想注册admin发现不行…

【C++进阶之路】IO流

文章目录 一、C语言的IO1.键盘与显示屏2. 文件与内存3.字符串与内存 二、CIO1.iostream1.1基本使用1.2operator bool 2. fstream2.1二进制的文件读写2.2字符串的文件读写 3. sstream3.1序列化与反序列化3.2拼接字符串3.3将数据类型转换为字符串 总结 一、C语言的IO 1.键盘与显…

企业知识库软件,快速构建企业知识分享与团队协同的软件

企业知识库是一种特殊的在线协同文档工具&#xff0c;支持包括FAQ、文档、视频、知识图谱等。从本质上讲&#xff0c;它是基于企业知识库软件从而实现内部或外部知识的沉淀、集合、更新、共享等&#xff0c;能为员工或客户提供常见问题的标准回答。 今天我就基于HelpLook &…

STP、堆叠与VRRP如何使用

✍ STP生成树用在哪里&#xff1f; ✍ STP和堆叠有什么区别&#xff1f; ✍ VRRP双网关热备份如何部署&#xff1f; --- 通过交换机组成网络是局域网&#xff0c;连接终端设备的交换机就是接入层交换机。 --- 如上组网结构单一&#xff0c;不需要网工。 容易发生单点故障&…

wireshark数据包内容查找功能详解

wireshark提供通过数据包特征值查找具体数据包的功能&#xff0c;具体查找功能如下&#xff0c; &#xff08;1&#xff09;选择查找目标区域&#xff08;也就是在哪里去匹配特征值&#xff09; 如下图&#xff0c;【分组列表】区域查找指的是在最上方的数据包列表区域查找&…

msvcr110.dll丢失的解决方法介绍,教你如何快速修复问题

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一种非常重要的资源。它们包含了可被多个程序共享的代码和数据。其中&#xff0c;MSVCR110.dll就是Visual Studio 2012的一个组件。然而&#xff0c;有时候我们可能会遇到“msvcr110.dll丢失”的问题&#x…

2023年传媒行业中期策略 AIGC从三个不同层次为内容产业赋能

基本面和新题材共振&#xff0c;推动传媒互联网行情上涨 AIGC 概念带动&#xff0c;传媒板块领涨 A 股 2023 年第一个交易日&#xff08;1 月 3 日&#xff09;至 6 月 2 日&#xff0c;申万传媒指数区间涨幅高达 48.38%&#xff0c;同时期沪深 300 跌幅为 0.25%&#xff0c;…

【Javascript】构造函数的参数写法

目录 写法一&#xff08;固定参数&#xff09;&#xff1a; 写法二&#xff08;对象类型的参数&#xff09; 写法一&#xff08;固定参数&#xff09;&#xff1a; 如果参数与参数的值不对应 写法一 要求位置严格对应&#xff0c;明确知道对象的属性 写法二&#xff08;对象类…