在使用 Spring WebFlux 框架中,你可以使用 org.springframework.http.codec.multipart.FilePart 类来获取上传的文件。
比如:
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class FileController {
@PostMapping("/upload")
public Mono<String> uploadFile(@RequestPart("file") FilePart filePart) {
return Mono.just("File uploaded successfully!");
在上述示例中,我们使用 @RequestPart 注解将请求中名为 “file” 的部分映射到 FilePart 类型的参数上。然后,你可以在方法体内对文件进行处理。例如,你可以通过调用 filePart.filename() 方法获取文件名,并将文件保存到指定位置。
需要注意的是,必须将 HTTP 请求的 Content-Type 设置为 multipart/form-data,以便支持文件上传。
接下来,我们将FilePart转成 MultipartFile,
可以自定义一个MultipartFile实现类:
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CustomMultipartFile implements MultipartFile {
private final String name;
private String originalFilename;
@Nullable
private String contentType;
private final byte[] content;
public CustomMultipartFile(String name, @Nullable byte[] content) {
this(name, "", null, content);
public CustomMultipartFile(String name, InputStream contentStream) throws IOException {
this(name, "", null, FileCopyUtils.copyToByteArray(contentStream));
public CustomMultipartFile(
String name, @Nullable String originalFilename, @Nullable String contentType, @Nullable byte[] content) {
Assert.hasLength(name, "Name must not be null");
this.name = name;
this.originalFilename = (originalFilename != null ? originalFilename : "");
this.contentType = contentType;
this.content = (content != null ? content : new byte[0]);
public CustomMultipartFile(
String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream)
throws IOException {
this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
@Override
public String getName() {
return this.name;
@Override
public String getOriginalFilename() {
return this.originalFilename;
@Override
@Nullable
public String getContentType() {
return this.contentType;
@Override
public boolean isEmpty() {
return (this.content.length == 0);
@Override
public long getSize() {
return this.content.length;
@Override
public byte[] getBytes() throws IOException {
return this.content;
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(this.content);
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.content, dest);
在将FilePart转成 CustomMultipartFile,这里需要指定文件的具体contentType 类型
private <T> Mono<T> toMultipartFile(FilePart filePart, Function<MultipartFile,T> function){
return DataBufferUtils.join(filePart.content()).flatMap(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return Mono.just(bytes);
}).map(fileBytes -> {
String fileName = filePart.filename();
String contentType = "text/plain";
return function.apply(new CustomMultipartFile(fileName, fileName, contentType, fileBytes));
});
@PostMapping("/api/test")
public Mono<String> test11(@RequestPart("file") FilePart filePart) {
return toMultipartFile(filePart,multipartFile -> {
return "success";
});
注意:以上代码,为作者个人观点。
本文主要讲述webflux文件上传
在工作中我们经常遇到需要上传文件至服务器,SpringMVC文件上传网上已有很多案例,但照搬到Webflux则行不通。原因在于在webflux中没有MultipartFile接口的实例,webflux是用FilePart这个接口传递文件的。
我的应用场景是将图片上传至阿里云的OSS,OSSSDK提供了一个将InputStream上传的接口。而要拿到InputSt...
MockMultipartFile 是一个用于测试的模拟类,通常在单元测试或集成测试中模拟 MultipartFile 的行为。它属于 Spring 框架的测试包 org.springframework.mock.web 中的一部分,不应该在生产环境中使用。因此我们采用实现MultipartFile接口类的方式,自己实现转换逻辑。
业务中需要调用别人提供的接口进行文件上传,但别人的接口只能上传MultipartFile类型的文件(吐槽一下,也不知道是哪个二货设计的这种接口)。所以需要在我们的业务代码中将File转化为MultipartFile。提供两种方法给大家。
一、使用MockMultipartFile类进行转换
这个方法比较简单,代码如下:
import java.io.File;
import java.io...
spring webflux 系列之 上传文件到七牛云篇(不用本地创建文件直接内存上传)
本次我介绍springboot 下 webflux 上传文件到七牛云;
网上基本上全部教程都是创建本地文件 才去上传七牛云 又要删除本地文件;
所以我直接放在内存里面 上传
代码如下:
//写法一:Mono<FilePart>
@PostMapping("/upload")
public Mono<Response> uploadFile(@RequestPart(val
java File 类型 转换成 MultipartFile
MutipartFile是spring里面定义的接口,它封装了用户在上传图片时所包含的所有信息,但是有些时候我们要将file转换成MutipartFile,才能在保持原有代码逻辑的情况下方便代码的调整,但是file不能直接转换成MutipartFile,网上方法较多,这里采用spring-mock实现。
1.引入mock maven
有些需求需要在后端把文件转换成MultipartFile然后再请求上传接口,通过查看MultipartFile接口源码,发现其实现类有两个:CommonsMultipartFile、MockMultipartFile.
由于MockMultipartFile在spring-test包,用于测试,所有这里用CommonsMultipartFile
来构造MultipartFile。
CommonsMultipartFile:
public class CommonsMultipartFile implemen
@GetMapping("test")
public void test(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 生成字节数组
byte[] bytes = BarCodeUtils.generateBarCode128("DCT...
这应该是使用springCloud上传文件的最可用文章;在springCould框架里上传文件时,发现以往的MultipartFile不可用,这是因为之前的springboot框架使用的是spring-boot-starter-web 启动;而springCould使用的是 spring-boot-starter-webflux 完全非阻塞模的流式。
最近在做一个技术项目的迁移,将老的springMVC项目迁移到SpringWebFlux项目中,在流量迁移过程中发现有一个业务方传过来的参数新项目拿不到,究其原因是老版本的spring解析器和新版本的解析器对。注意看,老版本的解析是判断文件名是否为空来决定它是不是一个formField。如果value值不是string,则是multipart。在解析每一个part的时候,会根据header。类型的contentType解析方式不一致。判断是否是formFiled的条件。
本文主要介绍Java Spring Webflux上传文件抛出415 UnsupportedMediaTypeStatusException问题解决方法及代码。文件从Angular 4前端上传到Spring Webflux控制器。控制器能够读取@RequestPart值但抛出415 UnsupportedMediaTypeStatusException。
原文地址:Java Spring Webflux上传文件MultipartFile问题(415 UnsupportedMediaTypeStatusExc
最近在做一个API网关产品,要开发一个API批量导入和导出的功能,因为网关使用的技术是spring cloud gateway,核心是WebFlux和reactor异步框架,导入使用的是spring-web的FilePart组件,一般导入使用的MultiPart在这里并不适用,在导出导出功能实现上,和webmvc有很多地方不一样,坑也比较多,网上也有很多类似的帖子及技术博客,但是在编码过程中还是有很多细节要注意,如果不是对这部分技术十分熟悉,其实很难完成这个功能的编码,下面具体介绍下实现过程及遇到的问题,不
在项目微服务的升级过程中,我们通常会设置一个网关,作为一个洪流的出入口,在Spring Cloud 中提供了对应的功能,也就是Spring Cloud Gateway。对于旧的项目springMVC,实际也就是将spring-webmvc升级为spring-webflux,但你会发现fromdata 形式的数据,在webmvc可以被封装成参数,而在webflux中却不能,是不支持吗?
在spring官方文档中,有提及对fromdata表单数据的获取,如下图
fromdata表单数据需要通过ServerWe
可以看到MultipartFile是个接口
转成MultipartFile格式则需要转成实现MultipartFile接口的实现类即可,如下选择转成用MockMultipartFile实现
首先:需要先引入依赖包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.9</