首页 > 其他分享 >SpringCloudGateway网关服务实现文件上传功能

SpringCloudGateway网关服务实现文件上传功能

时间:2024-11-06 23:33:03浏览次数:3  
标签:文件 网关 方案 SpringCloudGateway file org import 上传

@

目录

说明

Gateway网关服务本想实现前后端的文件上传及下载功能,但是在实际开发过程中屡屡产生报错,导致一直报错“400 bad request: Required request part 'file' is not present”后端无法解析接收到文件数据,从而导致无法实现前端文件上传及后端接收解析过程,本文就是为了记录成功案例,以及描述本人尝试其他方案的感受,便于其他人吸取经验,排雷。

SpringBoot和SpringCloudGateway项目区别说明

Spring Boot是一套基于Spring框架的微服务框架。
SpringCloudGateway基于webFlux框架实现的
框架不同就导致,之前网上传统的那套controller层方法就不适用,现在分别举例说明

1.SpringBoot的成功案例文件上传代码

pom

<!--文件上传-->
 <dependency>
     <groupId>commons-fileupload</groupId>
     <artifactId>commons-fileupload</artifactId>
     <version>1.3.3</version>
 </dependency>

前端代吗

<p>单文件上传并保存</p>
<form method="post" action="/excel/uploadExcel" enctype="multipart/form-data">
    <p><input type="file" name="file00"></p>
    <p><span th:if="${msg}"></span></p>
    <input type="submit" value="提交">
</form>

Controller代码 重点在:@RequestParam("file00") MultipartFile file

@PostMapping(value = "/uploadExcel")
    public String uploadExcel(@RequestParam("file00") MultipartFile file, Model model) throws IOException {
        try {
            if(file.isEmpty()){
                model.addAttribute("msg","上传失败,请选择文件!");
                return "excelIndex";
            }
            String filename = file.getOriginalFilename();
            //filePath获取的是编译后的路径,而不是项目看到的路径,filePath=/E:/WorkSpace/demo/target/classes/
            String filePath = ResourceUtils.getURL("classpath:").getPath()+"static/oneFile/";
            //避免文件重复覆盖
            String uuid= UUID.randomUUID().toString().replaceAll("-", "");
            //时间戳分类文件
            String time = new SimpleDateFormat("YYYY-MM").format(new Date());
            String realPath = filePath + time + "/" + uuid + "-" + filename;
            System.out.println("realPath:" + realPath);
            //最后保存的路径在这里:target/classes/static/oneFile/2022-02/548881060e3d417a91d87b0a10959077-sop.sql
            File dest = new File(realPath);
            //检测是否存在目录,无,则创建
            if(!dest.getParentFile().exists()){
                dest.getParentFile().mkdirs();//新建文件夹 多级目录
            }
            file.transferTo(dest);//文件写入
        } catch (IOException e) {
            e.printStackTrace();
        }
        model.addAttribute("msg","文件上传成功!");
        return "hello";
    }

会议详情

重要信息

大会介绍

第三届教育科学与社会文化国际学术会议(ESSC 2024)定于2024年12月27-29日在中国成都举行。会议旨在为从事“教育科学”与“社会文化”研究的专家学者提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路,加强学术研究和探讨,促进学术成果产业化合作的平台。大会诚邀国内外高校、科研机构专家、学者,企业界人士及其他相关人员参会交流。

2.SpringCloudGateway的成功案例文件上传代码

Controller代码

重点区别在:

1.注解中配置consumes = MediaType.MULTIPART_FORM_DATA_VALUE
2.形参采用@RequestPart("file") FilePart filePart,而不是传统的@RequestParam("file00") MultipartFile file,这是他两的区别

备注说明:

1.使用RequestPart来接收,得到的是FilePart
2.FilePart的content是Flux,可以使用DataBufferUtils写到文件或者直接使用transferTo写入到文件
详情可查看该文章了解 ->: SPRING WEBFLUX 前后端分离 文件上传

import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

import java.io.IOException;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  public Mono<String> requestBodyFlux(@RequestPart("file") FilePart filePart) throws IOException {
      System.out.println(filePart.filename());
      Path tempFile = Files.createFile(Paths.get("D:\\tmp\\"+filePart.filename()));

		//方法一
      AsynchronousFileChannel channel =
              AsynchronousFileChannel.open(tempFile, StandardOpenOption.WRITE);
      DataBufferUtils.write(filePart.content(), channel, 0)
              .doOnComplete(() -> {
                  System.out.println("finish");
              })
              .subscribe();

		//方法二
		//filePart.transferTo(tempFile.toFile());

      System.out.println(tempFile.toString());
      return Mono.just(filePart.filename());
  }

网上其他方案

说明:
1.针对前端代码格式书写错误导致
2.针对后端代码编写Filter过滤器文件进行解析
3.注入Bean方式 或者xml配置xxResolver解析器进行文件解析
下面方法直接拷贝可能会报错,里面某些类没有标注引用,会报错找不到或者调用还是报 "400 bad request: Required request part 'file' is not present"

其他方案1:配置filter

Spring-Cloud-Gateway获取multipart/form-data时无法正常获取

其他方案2:配置filter

SpringCloud-Gateway对multipart/form-data等其他POST请求类型的body体进行多次打开

其他方案3:注入Bean或者xml配置xxResolver解析器进行文件解析

Spring Cloud Gateway 之获取请求体(Request Body)的几种方式

其他方案4:既然MultipartFile后端接收不到,那就采用把上传文件进行Base64编码,通过json格式传给后台。

GATEWAY网关上传文件问题

其他方案5:修改前端vue

Vue上传通过“服务端签名后直传”上传文件到阿里云 报错 400 Bad Request

其他方案6:修改前端vue

vue put 提交 400 Bad Request(有时候可以提交成功)

其他方案7:xml配置xxResolver解析器进行文件解析

springMVC 文件上传 HTTP Status 400 – Bad Request

标签:文件,网关,方案,SpringCloudGateway,file,org,import,上传
From: https://www.cnblogs.com/bigcat26/p/18531260

相关文章

  • SpringBoot获取文件将要上传的IP地址
    说明:有的项目会涉及文件上传,比如“更换logo业务”,或者“自定义任务上传脚本等业务”都会涉及上传,而有的项目上传成功后找不到上传地址,所以需要打印IP,方便用户知晓上传的精确地址,下面封装了一个IPv4工具类(因为是拷贝现成代码其中会有某些参数未注释,不知道啥意思,敬请谅解!)IPv4......
  • ctfshow(162)--文件上传漏洞--远程文件包含
    Web162进入界面:思路先传个文件测试一下过滤:过滤了特别多符号,注意过滤了点.我们的思路还是要先上传.user.ini文件://修改前GIF89aauto_prepend_file=shell.png//由于过滤了点,所以修改为GIF89aauto_prepend_file=shell上传.user.ini文件接下来就是上传包含一......
  • ajax上传、下载文件
    一、上传1.上传数据的封装在上传文件时,最常用的方式是使用FormData对象,它会自动将请求头中的 Content-Type请求头指定为multipart/form-dataconstformData=newFormData();formData.append("file",fileInput.files[0]);//fileInput是<inputtype="file">con......
  • 算法网关视频分析网关室内消防逃生通道占用工厂企业消防安全AI视频智能监管解决方案
    在当前的企业运营中,消防安全管理是保障人员安全和企业资产不受损失的关键环节。然而,传统的消防安全监管方式往往面临着人力资源有限、技术手段不足等问题,导致无法及时有效地发现和处理潜在的火险隐患。为了应对这一挑战,算法网关视频分析网关利用先进的物联网技术,实现了对火灾风险......
  • 摄像机实时接入分析平台视频分析网关越界检测算法:智能安防的精准防控
    在当今的安全防护领域,越界检测技术的重要性日益凸显。作为人工智能视频监控技术的一个关键组成部分,越界检测视频分析网关能够实时、准确地监控,快速识别异常行为并触发警报,保障区域安全,以下是深入解析。一、技术原理与特点视频分析网关越界检测算法基于深度学习和计算机视觉技术......
  • 一文搞懂:AI网关这个新东西是什么意思?有没有开源免费的选择?
    AI网关是什么意思?有什么用?AI网关是企业应用与内外部大模型之间的桥梁,它位于企业应用与内外部大模型的调用交汇点。AI网关的主要功能是将应用请求通过集中管理模块转发给1内部自建模型、2外部大模型服务提供商,甚至3海外模型提供商。通过这种方式,AI网关在企业内管......
  • [Uniapp] APP拍照后转换Base64上传
    组件(2选1):1.uni-file-picker:https://uniapp.dcloud.net.cn/component/uniui/uni-file-picker.html2.u-upload: https://uviewui.com/components/upload.html 思路:不想直接把图片存到数据库,因为想着图片是小文件,也不是重要文件,干脆存到数据库里就好了。因此,计划在前端......
  • 第20章 SpringBoot上传文件
    在SpringBoot中实现文件上传仍然使用SpringMVC的MultipartFile类来处理。我们创建一个“SpringBootUploadDemo”的工程然后我们修改编码格式以及Maven仓库地址,我们省略这个过程了。接下来,我们修改“pom.xml”文件,添加SpringBoot和Web依赖,如下所示<?xmlversion="1.0......
  • 网站上传修改数据库,通过FTP和后台管理修改数据库的步骤
    一、通过FTP上传数据库文件备份现有数据库在进行任何操作之前,首先备份现有的数据库。可以通过phpMyAdmin或其他数据库管理工具导出数据库文件。准备新的数据库文件准备好新的数据库文件(通常为SQL文件),确保文件内容正确无误。连接到FTP服务器使用FTP客户端连接到你......
  • Typora配置图片上传功能:gitee码云+Picgo
    Typora配置图片上传功能:gitee码云+Picgo下载Picgo:官方在github上可以直接下载:链接在gitee上配置自己的仓库:Picgo的配置:首先打开picgo选择图床设置里的gitee然后设置自己的路径和名称:图床配置名随便起repo就是路径branch写自己的分支,我写的是masterpa......