Java Spring WebFlux文件上载:不支持的媒体类型415和多部分上载

Java Spring WebFlux文件上载:不支持的媒体类型415和多部分上载,java,spring,spring-boot,spring-webflux,project-reactor,Java,Spring,Spring Boot,Spring Webflux,Project Reactor,我在使用spring的反应式框架处理文件上传时遇到了一些问题。我想我正在关注文档,但无法摆脱这个415/不支持的媒体类型问题 我的控制器如下所示(根据这里的示例:) 我也尝试过使用@RequestPart(“数据”),但是得到了一个类似的不支持的媒体类型错误,尽管是文件的内容类型 Spring似乎在将这些转换为部分时遇到了问题。。?我被困住了-任何帮助都将被告知 好吧,这不是你问题的直接答案,因为我使用函数端点,但我希望它能对你有所帮助 import org.springframework.co

我在使用spring的反应式框架处理文件上传时遇到了一些问题。我想我正在关注文档,但无法摆脱这个
415
/
不支持的媒体类型问题

我的控制器如下所示(根据这里的示例:)

我也尝试过使用
@RequestPart(“数据”)
,但是得到了一个类似的
不支持的媒体类型
错误,尽管是文件的内容类型


Spring似乎在将这些转换为
部分时遇到了问题。。?我被困住了-任何帮助都将被告知

好吧,这不是你问题的直接答案,因为我使用函数端点,但我希望它能对你有所帮助

import org.springframework.context.annotation.Bean;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.http.codec.multipart.Part;
import org.springframework.stereotype.Controller;
import org.springframework.web.reactive.function.BodyExtractors;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;

import java.io.File;
import java.util.Map;

import static org.springframework.web.reactive.function.BodyInserters.fromObject;
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
import static org.springframework.web.reactive.function.server.RequestPredicates.path;
import static org.springframework.web.reactive.function.server.RouterFunctions.nest;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;

@Controller
public class FileUploadController {

    @Bean
    RouterFunction<ServerResponse> apiRoutes() {
        return nest(path("/api"),
                route(POST("/upload"), fileUpload()));
    }

    private HandlerFunction<ServerResponse> fileUpload() {
        return request -> {
            return request.body(BodyExtractors.toMultipartData()).flatMap(parts -> {
                        Map<String, Part> map = parts.toSingleValueMap();
                        final FilePart filePart = (FilePart) map.get("file");
                        final String dir = "C:\\JDeveloper\\mywork\\Spring\\SpringTest\\webflux-file-upload\\uploaded";
                        filePart.transferTo(new File(dir + "/" + filePart.filename()));

                        return ServerResponse.ok().body(fromObject("ok, file uploaded"));
                    }
            );
        };
    }

}

感谢@kojot的回答,但在本例中,我发现问题在于除了
spring-webflux
之外,我还临时加入了
spring-webmvc
。您的解决方案可能也会起作用,但我想坚持控制器风格,因此最终强制将
spring-webmvc
从我的
build.gradle
中排除:

configurations {
    implementation {
        exclude group: 'org.springframework', module: 'spring-webmvc'
    }
}
在那之后,它就如文件所记录的那样工作了

import org.springframework.context.annotation.Bean;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.http.codec.multipart.Part;
import org.springframework.stereotype.Controller;
import org.springframework.web.reactive.function.BodyExtractors;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;

import java.io.File;
import java.util.Map;

import static org.springframework.web.reactive.function.BodyInserters.fromObject;
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
import static org.springframework.web.reactive.function.server.RequestPredicates.path;
import static org.springframework.web.reactive.function.server.RouterFunctions.nest;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;

@Controller
public class FileUploadController {

    @Bean
    RouterFunction<ServerResponse> apiRoutes() {
        return nest(path("/api"),
                route(POST("/upload"), fileUpload()));
    }

    private HandlerFunction<ServerResponse> fileUpload() {
        return request -> {
            return request.body(BodyExtractors.toMultipartData()).flatMap(parts -> {
                        Map<String, Part> map = parts.toSingleValueMap();
                        final FilePart filePart = (FilePart) map.get("file");
                        final String dir = "C:\\JDeveloper\\mywork\\Spring\\SpringTest\\webflux-file-upload\\uploaded";
                        filePart.transferTo(new File(dir + "/" + filePart.filename()));

                        return ServerResponse.ok().body(fromObject("ok, file uploaded"));
                    }
            );
        };
    }

}
curl -F "file=@C:\Users\Wojtek\Desktop\img-5081775796112008742.jpg" localhost:8080/api/fileupload
configurations {
    implementation {
        exclude group: 'org.springframework', module: 'spring-webmvc'
    }
}