如何使用Curl将多个文件上传到Micronaut?

时间:2019-06-05 15:12:22

标签: curl micronaut

我需要管理向我的Micronaut控制器上传的多个文件(具有相同零件名称的多个零件)。

我尝试了以下方法:

@Post(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA)
HttpResponse upload(Publisher<CompletedFileUpload> files)

和这个:

HttpResponse upload(Publisher<Publisher<PartData>> files)

我用curl测试我的API,如下所示:

curl -X POST -F 'data=@/path/to/file1.txt' -F 'data=@/path/to/file2.txt' <SERVER_BASE_URL>/upload

或类似这样:

curl -X POST -F 'data=gruik' -F 'data=grok' <SERVER_BASE_URL>/upload

我得到的一切都是以下异常:

io.micronaut.web.router.exceptions.UnsatisfiedRouteException: Required argument [Publisher files] not specified
    at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:279)
    at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:122)
    at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$17(RoutingInBoundHandler.java:1360)
    at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:71)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.Flowable.subscribe(Flowable.java:14752)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.Flowable.subscribe(Flowable.java:14752)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty.subscribeActual(FlowableSwitchIfEmpty.java:32)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.Flowable.subscribe(Flowable.java:14752)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.Flowable.subscribe(Flowable.java:14755)
    at io.micronaut.http.context.ServerRequestTracingPublisher.lambda$subscribe$0(ServerRequestTracingPublisher.java:52)
    at io.micronaut.http.context.ServerRequestContext.with(ServerRequestContext.java:52)
    at io.micronaut.http.context.ServerRequestTracingPublisher.subscribe(ServerRequestTracingPublisher.java:52)
    at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.Flowable.subscribe(Flowable.java:14752)
    at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
    at io.reactivex.Flowable.subscribe(Flowable.java:14805)
    at io.reactivex.Flowable.subscribe(Flowable.java:14752)
    at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
    at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:288)
    at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:253)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

我知道该错误与我的代码无关,因为上载方法实际上为空,并且仅返回HttpResponse.ok()

我对curl的使用不正确吗? Micronaut中有错误吗?

非常感谢,伙计们!

1 个答案:

答案 0 :(得分:0)

我发现了我的错误:部件名称必须与上载方法(此处为files)中的参数名称匹配。

如果我将curl命令更改为:

curl -X POST -F 'files=@/path/to/file1.txt' -F 'files=@/path/to/file2.txt' <SERVER_BASE_URL>/upload

它就像一种魅力。