为了账号安全,请及时绑定邮箱和手机立即绑定

WebFlux:上传文件时出现问题

WebFlux:上传文件时出现问题

POPMUISE 2021-11-03 16:13:35
我正在开发一个客户端来使用 webflux 反应客户端上传文件:这是我的客户端代码:private Mono<String> postDocument(String authorization, InputStream content) {    try {        ByteArrayResource resource = new ByteArrayResource(IOUtils.toByteArray(content));        return client.post().uri(DOCS_URI)                .contentType(MediaType.MULTIPART_FORM_DATA)                .header(HttpHeaders.AUTHORIZATION, authorization)                .body(BodyInserters.fromMultipartData("file", resource))                .exchange()                .flatMap(res -> readResponse(res, String.class));    } catch (IOException e) {        throw new RuntimeException(e);    }}服务器端代码:    public Mono<ServerResponse> createDocument(ServerRequest request) {    return request.body(toMultipartData())            .flatMap(parts -> Mono.just((FilePart) parts.toSingleValueMap().get("file")))            .flatMap(part -> {                try {                    String fileId = IdentifierFactory.getInstance().generateIdentifier();                    File tmp = File.createTempFile(fileId, part.filename());                    part.transferTo(tmp);                    String documentId = IdentifierFactory.getInstance().generateIdentifier();                    String env = request.queryParam("env")                            .orElse("prod");                    CreateDocumentCommand cmd = new CreateDocumentCommand(documentId, tmp, part.filename(), env);                    return Mono.fromFuture(cmdGateway.send(cmd));                } catch (IOException e) {                    throw new RuntimeException(e);                }            })            .flatMap(res -> ok().body(fromObject(res)));}我得到这个错误:java.lang.ClassCastException: org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossPart cannot be cast to org.springframework.http.codec.multipart.FilePart
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我有示例代码,但在 Kotlin 中。

我希望它能帮助你。


第一种方式(节省内存)



upload(stream: InputStream, filename: string): HashMap<String, Any> {

        val request: MultiValueMap<String, Any> = LinkedMultiValueMap();

        request.set("file", MultipartInputStreamFileResource(stream, filename))

        return client.post().uri("http://localhost:8080/files")

            .contentType(MediaType.MULTIPART_FORM_DATA)

            .body(BodyInserters.fromMultipartData(request))

            .awaitExchange().awaitBody()

}


class MultipartInputStreamFileResource(inputStream: InputStream?, private val filename: String) : InputStreamResource(inputStream!!) {

        override fun getFilename(): String? {

            return filename

        }


        @Throws(IOException::class)

        override fun contentLength(): Long {

            return -1 // we do not want to generally read the whole stream into memory ...

        }


}


第二种方式


//You wrote a file to somewhere in the controller then send the file through webclient


upload(stream: InputStream, filename: string): HashMap<String, Any> {

        val request: MultiValueMap<String, Any> = LinkedMultiValueMap();

        request.set("file", FileSystemResource(File("/tmp/file.jpg")))

        return client.post().uri("http://localhost:8080/files")

            .contentType(MediaType.MULTIPART_FORM_DATA)

            .body(BodyInserters.fromMultipartData(request))

            .awaitExchange().awaitBody()

}

第三种方式


upload(file: Part): HashMap<String, Any> {

        val request: MultiValueMap<String, Any> = LinkedMultiValueMap();

        request.set("file", file)

        return client.post().uri("http://localhost:8080/files")

            .contentType(MediaType.MULTIPART_FORM_DATA)

            .body(BodyInserters.fromMultipartData(request))

            .awaitExchange().awaitBody()

}


查看完整回答
反对 回复 2021-11-03
?
跃然一笑

TA贡献1826条经验 获得超6个赞

这对我有用


MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();

bodyBuilder.part("file", new ClassPathResource("/bulk_upload/test.xlsx"));



List<DataFileAdjustment> list = webClient.post().uri("/bulk").accept(MediaType.APPLICATION_JSON)

        .body(BodyInserters.fromMultipartData(bodyBuilder.build()))

        .exchange()

        .expectStatus().isOk()


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 537 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信