在SpringBoot中实现文件上传

news2024/11/28 20:56:53

        1.创建一个SpringBoot的项目,需要导入spring-boot-starter-web的依赖

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        2.编写文件的核心配置application.properties

server.port=2100
#文件的保存地址
file-save-path=D:/a/f/picture/

#是否开启文件上传支持,默认为true。
spring.servlet.multipart.enabled=true 
#文件写入磁盘的阈值,默认为0。
spring.servlet.multipart.file-size-threshold=0
#上传文件的临时保存位置。
spring.servlet.multipart.location=D:/1javaweb/b
#上传的单个文件的最大大小,默认为1MB。
spring.servlet.multipart.max-file-size=30MB
#多文件上传时文件的总大小,默认为10MB。
spring.servlet.multipart.max-request-size=10MB
#文件是否延迟解析,默认为false。
spring.servlet.multipart.resolve-lazily=false

        3.编写控制层

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


@RestController
public class FileUploadController {
    @Value("${file-save-path}")
    private String fileSavePath;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/");

    @RequestMapping("/upload")
    public String upload(MultipartFile uploadFile, HttpServletRequest req) {
        String filePath = "";
        String format = sdf.format(new Date());
        File folder = new File(fileSavePath + format);
        if (!folder.isDirectory()) {
            folder.mkdirs();
            String oldName = uploadFile.getOriginalFilename();
            String newName = UUID.randomUUID().toString() +
                    oldName.substring(oldName.lastIndexOf("."), oldName.length());
            try {
                uploadFile.transferTo(new File(folder, newName));
                filePath = req.getScheme() + "://" + req.getServerName() + ":" +
                        req.getServerPort() + "/uploadFile/" + format + newName;
            } catch (IOException e) {
                return "上传失败! ";
            }
        }
        String oldName = uploadFile.getOriginalFilename();
        String newName = UUID.randomUUID().toString().replace("-","") +
                oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
            uploadFile.transferTo(new File(folder, newName));
            filePath = req.getScheme() + "://" + req.getServerName() + ":" +
                    req.getServerPort() + "/uploadFile/" + format + newName;
        } catch (IOException e) {
            return "上传失败! ";
        }
        return filePath;
    }
}

        4.在resources下创建static目录,然后创建update.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title></head>
<body>
    <!--enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。-->
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" value="请选择文件" required>
    <input type="submit" value="上传">
</form>
</body>
</html>

        5.如果想要在缓存中查询刚刚上传的文件或图片,需要添加以下配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Value("${file-save-path}")
    private String fileSavePath;
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/uploadFile/**")
                .addResourceLocations("file:"+fileSavePath);
    }
}

        6.如果想要任何ip都能访问,需要添加以下配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CarsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//所有的都配置跨域
                .allowedOrigins("*")//所有的请求可以访问跨域的资源
                 .allowedHeaders("*")//所有的请求头都可以访问
        .allowedMethods("GET","POST","PUT","DELETE","HEAD","OPTION")//什么类型的请求都可以访问后端资源
         .maxAge(3600)//服务端存储相关信息的时间      秒
        ;
    }
}

        7.启动我们的SpringBoot项目,访问该地址

http://localhost:2100/update.html

         如果我们配置了刚刚的WebConfig配置类,上传后的这个地址我们可以直接在浏览器进行访问,就可以看到我们刚刚上传的图片

         如果配置了跨域访问,则可以通过我们的ip访问,在别的计算机上也可以访问

查询本机计算机的ip: 

       1. 快捷键: win+r,在弹出的窗口输入cmd后点击确定

         2.输入

ipconfig

        找到自己电脑在当前局域网下的ip

 

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

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

相关文章

ASEMI二极管MURF2080CTR封装, MURF2080CTR大小

编辑-Z MURF2080CTR参数描述&#xff1a; 型号&#xff1a;MURF2080CTR 最大峰值反向电压(VRRM)&#xff1a;800V 最大RMS电压(VRMS)&#xff1a;430V 最大直流阻断电压VR(DC)&#xff1a;800V 平均整流正向电流(IF)&#xff1a;20A 非重复峰值浪涌电流(IFSM)&#xff1…

亚马逊会员日结束了,如何防止销量和排名“断崖式”下跌?

令人瞩目的2023亚马逊Prime会员日落下了帷幕&#xff0c;据官方数据显示&#xff0c;48小时售出商品超3.75亿件&#xff0c;再一次创造了历史新纪录&#xff01; 好不容易因为亚马逊会员日提升了销售额和曝光了品牌&#xff0c;那么会员日结束了&#xff0c;如何稳住您的销量和…

【网站建设】HTTP/HTTPS 是什么?有什么区别?

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff0c;感…

STM32H743 W25Q128 Keil烧录算法的制作、内存映射代码、分散加载文件源码分享

一、W25Q128烧录算法的制作 1、前言 最近做项目用到STM32H743这款芯片&#xff0c;其内部FLash有2M&#xff0c;但是项目中用到touchgfx&#xff0c;如果资源放到内部Flash中会造成两个问题&#xff0c;一是图片过多会导致内部Flash不够用&#xff0c;二是每次修改一下程序都…

一文了解近端边缘 IT 基础架构技术需求

随着边缘计算相关技术的逐渐成熟&#xff0c;边缘应用的种类也呈现多样化发展。IDC 2023 年发布的《全球边缘支出指南》归纳出 400 多种跟边缘相关的应用——这是在从 9 个地理区域、17 个技术市场、6 个技术领域和 19 个行业当中汇总出来的。 边缘计算的复杂和边缘应用的多样…

Leetcode-每日一题【24.两两交换链表中的节点】

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4]输出&#xff1a;[…

【玩转Linux操作】详细讲解 Linux分区磁盘 操作以及相关的命令

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;什么是Linux的分区&#x1f354;Linux分区的作用&a…

没有代码基础如何学习自动化测试

因为最近在群里有一些同学&#xff0c;之前没做过自动化测试&#xff0c;但是限于领导要求&#xff0c;或者自己想提升了&#xff0c;开始研究自动化测试&#xff0c;最近记忆比较深的低级的几个问题是&#xff1a; 1、编写一个python的类将 __init__写成_init_苦于问题一直解…

springboot项目使用mybatis-plus启动报错

在使用最新的mybatis-plus的时候&#xff0c;遇到一个报错 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name payMentController: Unsatisfied dependency expressed through field payMentService; nested exception is…

mybatis-plus代码生成器使用指南

mybatis-plus代码生成器 官网&#xff1a;mp代码生成器&#xff08;新&#xff09; 1、导入依赖 使用最新版本&#xff1a;3.5.3.1版本&#xff0c;老版本不兼容 <properties><mybatis-plus.version>3.5.3.1</mybatis-plus.version><freemarker.versio…

集成VCO-Cadence ADE相位噪声分析

集成VCO-Cadence ADE相位噪声分析 简介环境软件工艺 参考振荡器原理图相位噪声说明pss设置1234 pnoise设置12345 结果 简介 本文主要是使用Cadence ADE仿真1GHz交叉耦合振荡器&#xff0c;得到相位噪声曲线&#xff0c;主要记录仿真设置过程&#xff0c;仅供参考&#xff0c;如…

零拷贝技术(DMA、MMAP、sendfile)

零拷贝mmap、sendfile 定义 零拷贝技术主要是解决传统网络I/O操作中发送文件的性能问题&#xff1a;如下图表示一次read和write时传统I/O涉及到的CPU操作&#xff1a; 涉及到4次用户态↔内核态上下文切换&#xff0c;其中read切换两次、write切换两次&#xff1b;涉及到4次数…

IntelliJ IDEA 忽略Git提交

在项目下新建 .gitignore 文件 在 .gitignore 文件写入以下内容&#xff0c;从上图可以看到&#xff0c;忽略提交的这些目录/文件变成了黄色

P2372 yyy2015c01挑战算周长

yyy2015c01挑战算周长 题目背景 yyy2015c01 快速的解决了问题&#xff0c;受到邻居们的赞许&#xff0c;高兴的回到家&#xff0c;把糖给了妈妈&#xff0c;吃了香喷喷的午饭&#xff0c;又睡了一个甜甜的午觉&#xff0c;感觉人生真美好。下午爸爸回到家&#xff0c;听说了 …

设计模式 ~ 单例模式

单例模式 单例模式是一种设计模式&#xff0c;指在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例&#xff1b; 前端对于单例模式不常用&#xff0c;但是单例的思想无处不在&#xff1b; 创建之后缓存以便继续使用&#xff1b; 如&#xff1a;弹窗、遮罩…

HCIP——HCIA回顾及静态实验

HCIP HCIA一、知识回顾1、OSI七层参考模型&#xff1a;2、重要的几个协议报头格式 二、静态实验1、实验拓扑图2、实验要求3、实验思路4、实验步骤1、给接口划分IP地址以及配置环回地址2、交换机配置划分VLAN3、配置静态路由4、配置DHCP服务5、测试6、优化 HCIA 1、七层参考模型…

遭黑客攻击后反而涨了千百倍?

近期&#xff0c;遭遇黑客攻击后的某数字藏品平台悄悄“复活”&#xff0c;引发业界关注。复出后&#xff0c;该平台上的数字藏品持续暴涨&#xff0c;大部分涨幅均超过百倍&#xff0c;少数藏品甚至超过了千倍。事出反常必有妖。这波涨势难免令人怀疑其中是否存在投机炒作行为…

常用API学习05(Java)

Runtime Runtime表示当前虚拟机的运行环境&#xff0c;Runtime的方法我们不能自己直接去new。 public static Runtime getRuntime() 当前系统的运行环境对象 public void exit(int status) 停止虚拟机 public int availableProcessors() 获得cpu的线程数 publ…

UEC++:间接属性引用

1. 优点&#xff1a;优化内存和时间加载问题&#xff1b; 2. 实现&#xff1a;4.18之前使用的是FStringAssetReference&#xff1a; 所有资源文件都能拾取&#xff01;&#xff01;&#xff01; 结果&#xff1a; 3. 实现&#xff1a; 设置音频文件&#xff1a;

ping的工作原理

ICMP包头格式&#xff1a; icmp报文封装在IP包内&#xff0c;工作在网络层&#xff0c;是IP协议帮手。 查询报文类型 可向对端主机发送回送请求的消息&#xff08;类型 8&#xff09;也可接收对端主机发回来的回送应答消息&#xff08;类型 0&#xff09; 查询报文又增添了标…