Spring WebClient BodyInserters.fromResource() 更改内容类型?
Spring WebClient BodyInserters.fromResource() changes content-type?
我是 Spring 的 WebClient 新手。我正在尝试 post 使用内容类型 application/octet-stream 的文件内容。最初我将文件的内容加载到一个字节数组中并使用 .bodyValue() 来添加它。这非常有效。
byte[] data;
// read file into byte array here ...
FileUploadResponse resp = client.post().uri(uri)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.accept(MediaType.APPLICATION_JSON)
.bodyValue(data) // From byte[]
.retrieve()
.bodyToMono(FileUploadResponse.class)
.block();
显然将文件的全部内容加载到内存中不是很好。所以我做了一些搜索,看起来我需要使用“来自资源主体插入器”。所以我将代码更改为:
// Use a Spring FileSystemResource that will be used to insert the data into the body.
FileSystemResource resource = new FileSystemResource(localFilename);
// Create a web client
WebClient client = WebClient.create();
FileUploadResponse resp = client.post().uri(uri)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromResource(resource)) // From file resource
.retrieve()
.bodyToMono(FileUploadResponse.class)
.block();
现在内容类型作为“text/plain”发送(见下文)
POST /fileupload
accept-encoding: gzip
user-agent: ReactorNetty/0.9.11.RELEASE
host: localhost:8080
Content-Type: text/plain
Accept: application/json
我做错了什么? BodyInserters.fromResource() 是否总是将内容类型覆盖为“text/plain”?有没有其他方法可以做到这一点?
谢谢!
它的发生是因为 ResourceHttpMessageWriter
中 application/octet-stream
的 specific handling。它尝试通过文件扩展名检测 MIME 类型。
您可以使用 InputStreamResource
来保留 application/octet-stream
var resource = new InputStreamResource(new FileInputStream(localFilename));
我是 Spring 的 WebClient 新手。我正在尝试 post 使用内容类型 application/octet-stream 的文件内容。最初我将文件的内容加载到一个字节数组中并使用 .bodyValue() 来添加它。这非常有效。
byte[] data;
// read file into byte array here ...
FileUploadResponse resp = client.post().uri(uri)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.accept(MediaType.APPLICATION_JSON)
.bodyValue(data) // From byte[]
.retrieve()
.bodyToMono(FileUploadResponse.class)
.block();
显然将文件的全部内容加载到内存中不是很好。所以我做了一些搜索,看起来我需要使用“来自资源主体插入器”。所以我将代码更改为:
// Use a Spring FileSystemResource that will be used to insert the data into the body.
FileSystemResource resource = new FileSystemResource(localFilename);
// Create a web client
WebClient client = WebClient.create();
FileUploadResponse resp = client.post().uri(uri)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromResource(resource)) // From file resource
.retrieve()
.bodyToMono(FileUploadResponse.class)
.block();
现在内容类型作为“text/plain”发送(见下文)
POST /fileupload
accept-encoding: gzip
user-agent: ReactorNetty/0.9.11.RELEASE
host: localhost:8080
Content-Type: text/plain
Accept: application/json
我做错了什么? BodyInserters.fromResource() 是否总是将内容类型覆盖为“text/plain”?有没有其他方法可以做到这一点?
谢谢!
它的发生是因为 ResourceHttpMessageWriter
中 application/octet-stream
的 specific handling。它尝试通过文件扩展名检测 MIME 类型。
您可以使用 InputStreamResource
来保留 application/octet-stream
var resource = new InputStreamResource(new FileInputStream(localFilename));