Как загрузить несколько файлов в Micronaut с помощью Curl? - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно управлять несколькими загрузками файлов на мой контроллер Micronaut (несколько деталей с одинаковым именем детали).

Я попробовал следующий метод:

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

и вот этот:

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

Я тестирую свой API с помощью curl следующим образом:

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().

Правильно ли используется скручивание? В Micronaut есть ошибка?

Большое спасибо, ребята!

1 Ответ

0 голосов
/ 06 июня 2019

Я нашел свою ошибку: имя детали должно совпадать с именем аргумента в методе загрузки, здесь files.

Если я изменю свою команду curl на:

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

Работает как шарм.

...