ColdFragrance opened a new issue, #5430:
URL: https://github.com/apache/shenyu/issues/5430

   ### Question
   
   I want to develop a plugin that deal with multipart/form-data,but i got 
"org.springframework.core.codec.DecodingException: Could not find first 
boundary" error.Who can help me? Thanks a lot.
   Here is my code:
        else if (MediaType.MULTIPART_FORM_DATA.isCompatibleWith(mediaType)) {
                /** 获取body中的multipart-data内容并处理 */
                serverWebExchangeMono = exchange.getMultipartData()
                        .switchIfEmpty(Mono.defer(() -> Mono.just(new 
LinkedMultiValueMap<>())))
                        .flatMap(data -> {
                                System.out.println("111111111");
                                System.out.println(data);
                                Map<String, Part> multipartData = 
data.toSingleValueMap();
                                log.debug("\r\n获取multipart data数据成功, 
data:\r\n{}", multipartData);
                                return exchange;
                        });
        }
                
                
   And this is curl-command
   curl --location --request POST 'http://localhost:9077/file/httpfile/upload' \
   --header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
   --header 'Accept: */*' \
   --header 'Host: localhost:9077' \
   --header 'Connection: keep-alive' \
   --header 'Content-Type: multipart/form-data; 
boundary=--------------------------034594991181964962308916' \
   --form 'file=@"E:\\笔记.txt"'
   
   And error message as follows
   [2024-02-01 17:32:23] [DEBUG] [com.boot.handler.RequestLogHandler:71] -- 
mediaType >> 
multipart/form-data;boundary=--------------------------034594991181964962308916
   [2024-02-01 17:32:24] [ERROR] [com.boot.plugin.FlowPlugin:194] -- 其他异常 >> 
org.springframework.core.codec.DecodingException
   [2024-02-01 17:32:24] [ERROR] [com.boot.plugin.FlowPlugin:195] -- {}
   org.springframework.core.codec.DecodingException: Could not find first 
boundary
        at 
org.springframework.http.codec.multipart.MultipartParser$PreambleState.onComplete(MultipartParser.java:317)
        at 
org.springframework.http.codec.multipart.MultipartParser.hookOnComplete(MultipartParser.java:120)
        at 
reactor.core.publisher.BaseSubscriber.onComplete(BaseSubscriber.java:197)
        at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
        at 
reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
        at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
        at reactor.core.publisher.Operators.complete(Operators.java:137)
        at reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:176)
        at reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:143)
        at 
reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
        at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
        at 
reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
        at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
        at 
reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
        at 
org.springframework.http.codec.multipart.MultipartParser.lambda$parse$1(MultipartParser.java:98)
        at reactor.core.publisher.FluxCreate.subscribe(FluxCreate.java:94)
        at 
org.springframework.http.codec.multipart.PartGenerator.lambda$createParts$1(PartGenerator.java:113)
        at reactor.core.publisher.FluxCreate.subscribe(FluxCreate.java:94)
        at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)
        at 
reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
        at 
reactor.core.publisher.MonoCacheTime.subscribeOrReturn(MonoCacheTime.java:143)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4385)
        at 
reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:203)
        at 
reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
        at 
reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
        at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
        at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
        at 
reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
        at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
        at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
        at 
reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236)
        at 
reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
        at 
reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126)
        at 
reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:148)
        at 
reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
        at 
reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
        at 
reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2194)
        at 
reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2068)
        at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
        at 
reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:255)
        at 
reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
        at 
reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
        at 
reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
        at 
reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
        at 
reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:127)
        at 
reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
        at 
reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:295)
        at 
reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
        at 
reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
        at 
reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
        at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
        at 
reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
        at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
        at 
reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:400)
        at 
reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:419)
        at 
reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:590)
        at 
reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at 
reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:264)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at 
io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
        at 
io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
        at 
io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
        at 
io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at 
io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at 
io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
        at 
io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
        at 
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Unknown Source)
   [2024-02-01 17:32:24] [ERROR] 
[org.apache.shenyu.web.handler.GlobalErrorHandler:53] -- handle error: 
[133d6b7a-1] Resolved [DecodingException: Could not find first boundary] for 
HTTP POST /file/httpfile/upload
   org.springframework.core.codec.DecodingException: Could not find first 
boundary
        at 
org.springframework.http.codec.multipart.MultipartParser$PreambleState.onComplete(MultipartParser.java:317)
        Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
   Error has been observed at the following site(s):
        *__checkpoint ⇢ 
org.apache.shenyu.web.configuration.ErrorHandlerConfiguration$1 
[DefaultWebFilterChain]
        *__checkpoint ⇢ org.apache.shenyu.web.filter.FileSizeFilter 
[DefaultWebFilterChain]
        *__checkpoint ⇢ org.apache.shenyu.web.filter.CrossFilter 
[DefaultWebFilterChain]
        *__checkpoint ⇢ 
org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter 
[DefaultWebFilterChain]
        *__checkpoint ⇢ HTTP POST "/file/httpfile/upload" 
[ExceptionHandlingWebHandler]
   Original Stack Trace:
                at 
org.springframework.http.codec.multipart.MultipartParser$PreambleState.onComplete(MultipartParser.java:317)
                at 
org.springframework.http.codec.multipart.MultipartParser.hookOnComplete(MultipartParser.java:120)
                at 
reactor.core.publisher.BaseSubscriber.onComplete(BaseSubscriber.java:197)
                at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
                at 
reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
                at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
                at reactor.core.publisher.Operators.complete(Operators.java:137)
                at 
reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:176)
                at 
reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:143)
                at 
reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
                at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
                at 
reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
                at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
                at 
reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
                at 
org.springframework.http.codec.multipart.MultipartParser.lambda$parse$1(MultipartParser.java:98)
                at 
reactor.core.publisher.FluxCreate.subscribe(FluxCreate.java:94)
                at 
org.springframework.http.codec.multipart.PartGenerator.lambda$createParts$1(PartGenerator.java:113)
                at 
reactor.core.publisher.FluxCreate.subscribe(FluxCreate.java:94)
                at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)
                at 
reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
                at 
reactor.core.publisher.MonoCacheTime.subscribeOrReturn(MonoCacheTime.java:143)
                at reactor.core.publisher.Mono.subscribe(Mono.java:4385)
                at 
reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:203)
                at 
reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
                at 
reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
                at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
                at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
                at 
reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
                at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
                at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
                at 
reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236)
                at 
reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203)
                at 
reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126)
                at 
reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:148)
                at 
reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
                at 
reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
                at 
reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2194)
                at 
reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2068)
                at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
                at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
                at 
reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:255)
                at 
reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
                at 
reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
                at 
reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
                at 
reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
                at 
reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:127)
                at 
reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
                at 
reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:295)
                at 
reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337)
                at 
reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
                at 
reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
                at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
                at 
reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260)
                at 
reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142)
                at 
reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:400)
                at 
reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:419)
                at 
reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:590)
                at 
reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
                at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
                at 
reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:264)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
                at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
                at 
io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
                at 
io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
                at 
io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
                at 
io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
                at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
                at 
io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
                at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
                at 
io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
                at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
                at 
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
                at 
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
                at 
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
                at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
                at 
io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
                at 
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
                at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
                at java.lang.Thread.run(Unknown Source)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to