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

news/2024/11/6 23:23:53/文章来源:https://www.cnblogs.com/bigcat26/p/18531260

@

目录
  • 说明
  • SpringBoot和SpringCloudGateway项目区别说明
  • 1.SpringBoot的成功案例文件上传代码
    • pom
    • 前端代吗
    • Controller代码 重点在:@RequestParam("file00") MultipartFile file
  • 2.SpringCloudGateway的成功案例文件上传代码
    • Controller代码
  • 网上其他方案
    • 其他方案1:配置filter
    • 其他方案2:配置filter
    • 其他方案3:注入Bean或者xml配置xxResolver解析器进行文件解析
    • 其他方案4:既然MultipartFile后端接收不到,那就采用把上传文件进行Base64编码,通过json格式传给后台。
    • 其他方案5:修改前端vue
    • 其他方案6:修改前端vue
    • 其他方案7:xml配置xxResolver解析器进行文件解析

说明

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.sqlFile dest = new File(realPath);//检测是否存在目录,无,则创建if(!dest.getParentFile().exists()){dest.getParentFile().mkdirs();//新建文件夹 多级目录}file.transferTo(dest);//文件写入} catch (IOException e) {e.printStackTrace();}model.addAttribute("msg","文件上传成功!");return "hello";}

会议详情

重要信息

  • 大会官网:https://ais.cn/u/vEbMBz

大会介绍

第三届教育科学与社会文化国际学术会议(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

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

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

相关文章

React.memo vs. useMemo: Major differences and use cases

from: https://blog.logrocket.com/react-memo-vs-usememo/Memoization is one of the ways to optimize performance. In this article, we’ll explore how it works in React. What is memoization? In simple terms, memoization is a process that allows us to cache …

菱形

1/定义在同一平面内,有一组邻边相等的平行四边形是菱形如图,四边形 \(ABCD\) 是一个菱形 2/性质 首先,在平行四边形原有的基础上,菱形还有一些特有的性质:对角线互相垂直 \(\because \text{平行四边形}ABCD\) \(\therefore AO = OC, BO = OD\) \(\because AB = BC\) \(\th…

个人练习前端技术使用Bootstrap、JQuery、thymeleaf

个人练习前端技术使用Bootstrap、JQuery、thymeleaf说明:本代码只是为了本人练习前后端联动技术,包含html,jquery,thymeleaf模板、ajax请求及后端功能联动,方便自己查找及使用。@目录代码场景场景1.table批量查询功能(有默认值),点击"查询最新数据"从后台查询…

uBlocklist屏蔽垃圾搜索结果

近年来特别是 Google 的中文搜索结果体验越来越差,出现了越来越多「不知所谓」的网站,这些网站通过机器翻译、直接复制的方式「拼接」而成一个网站占据了大量的搜索结果,这类网站就是——「内容牧场」。 什么是内容牧场 内容农场(或内容工厂,英文名为 content farm)是指生…

正则表达式如何匹配中文

正则表达式如何匹配中文\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下 匹配中文字符的正则表达式:[\u4e00-\u9fa5]或许你也需要匹配双字节字符,所谓“双字节字符”就是长度是两个字节(byte)的字符,比如“嗨”、“!”、“。”,汉字及中文标…

windows下电脑自定义磁盘图标,u盘图标,文件夹图标

闲言 更改图标要确定有ico(icon)格式图片文件, 文件比例1:1, 一般像素大小比例推荐128:128 确保文件后缀有显示目录闲言寻找或制作ico图片直接下载网络图片制作ico文件在线制作本地制作ico磁盘/U盘图标更改文件夹图标更改 寻找或制作ico图片 直接下载网络图片 这里推荐阿里巴巴…

Macbook M1下安装elasticsearch

一、下载安装包(Kibana 的版本需要和 Elasticsearch 的版本一致。这是官方支持的配置。) 地址分别为:ElasticSearch:https://www.elastic.co/cn/downloads/elasticsearch kibana:https://www.elastic.co/cn/downloads/kibana对于Mac M1芯片基于ARM架构应该选择Aarch64(另…

博客园sakura主题只显示每天一篇或者显示不完随笔bug的修复

关于主题只显示每天第一个博文的的bug 问题 在布置sakura博客园主题的时候,发现这个主题只会显示每一天发布的博文中最晚发布的,其他的就不发了,很奇怪。去去翻了这个主题作者的博文也说了有这bug,但由于这个主题一直没更新,所以也一直没修复。因为比较喜欢这个主题,也抱…

element Plus 设置主题背景色

其主要通过给html动态的添加一个dark类。 主要要通过dom获取html标签,然后给html标签设置className 需要在main.ts中引入dark所在的css文件:具体可以参考element Plus的官网

基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率

1.程序功能描述 基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出ACO优化的收敛曲线,规划路径结果和每一条路径的满载率。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%搜索 for i=1:Iteration iis_best=0; for j=1:Npop%蚂蚁搜索一次Ants …

六自由度Stewart控制系统matlab仿真,带GUI界面

1.课题概述六自由度Stewart平台控制系统是一种高精度、高稳定性的运动模拟装置,广泛应用于飞行模拟、汽车驾驶模拟、虚拟现实、精密定位等领域。其工作原理基于Stewart机构(也称为并联机构)的设计理念,通过六个独立的线性致动器(通常为液压缸或电动推杆)连接固定基座与移…

20241106-语音视频转文字的测试及其价格

一、绘影Ai字幕价格 个人专业版本60元, 商用大约一个120元,支持批量。 二、手机app 讯飞语音、语音转文字等 讯飞听见迅捷转语音 https://www.bilibili.com/read/cv21023516/ 功能 价格 视频、语音转文字的原理 涉及的模型 感悟: 我使用33字幕本地识别,实在太废时间了。我…