Java Spring WebFlux文件上载:不支持的媒体类型415和多部分上载
我在使用spring的反应式框架处理文件上传时遇到了一些问题。我想我正在关注文档,但无法摆脱这个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
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'
}
}