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”?有没有其他方法可以做到这一点?

谢谢!

它的发生是因为 ResourceHttpMessageWriterapplication/octet-streamspecific handling。它尝试通过文件扩展名检测 MIME 类型。

您可以使用 InputStreamResource 来保留 application/octet-stream

var resource = new InputStreamResource(new FileInputStream(localFilename));