2016-02-22 5 views
0

Я пытаюсь создать контроллер, загрузить большой файл, используя RxNettyRxNetty загрузить большой файл

я что-то глупое, как

@RequestMapping(method = RequestMethod.GET, path = "largeFile") 
public DeferredResult<ResponseEntity<byte[]>> largeFile() throws IOException { 
    Observable<ResponseEntity<byte[]>> observable = RxNetty.createHttpGet(URL) 
              .flatMap(AbstractHttpContentHolder::getContent) 
              .map(data -> { 
               byte[] bytes = new byte[data.readableBytes()]; 
               data.readBytes(bytes); 
               return new ResponseEntity<>(bytes, HttpStatus.OK); 
              }); 
    DeferredResult<ResponseEntity<byte[]>> deferredResult = new DeferredResult<>(); 
    observable.subscribe(deferredResult::setResult, deferredResult::setErrorResult); 
    return deferredResult; 
} 

Тем не менее у меня есть написать следующее сообщение об ошибке:

Caused by: io.netty.handler.codec.TooLongFrameException: HTTP content length exceeded 1048576 bytes. 

ответ

0

Клиент по умолчанию в RxNetty 0.4.x агрегирует полезную нагрузку HTTP, которая имеет ограничение на максимальную длину содержимого. Исключение из-за этого ограничения. Вы можете изменить клиента по умолчанию с помощью PipelineConfigurator, как показано в следующем примере:

https://github.com/ReactiveX/RxNetty/blob/0.4.x/rxnetty-examples/src/main/java/io/reactivex/netty/examples/http/chunk/HttpChunkClient.java#L49

, после чего полезная нагрузка будет разбит на несколько буферов.

В качестве альтернативы, если вы знаете максимальный размер, то вы можете использовать соответствующий агрегатор полезной нагрузки в конфигураторе.