Как получить StreamingOutput на стороне клиента с помощью jersey2 - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу, чтобы мой сервер передавал файл обратно клиенту Jersey2 с потоковым выводом. Сервер выдает APPLICATION_OCTET_STREAM_VALUE. На стороне клиента я также установил в качестве допустимого типа носителя ответа APPLICATION_OCTET_STREAM.

Но я всегда получаю сообщение об ошибке «HttpMediaTypeNotAcceptableException: не удалось найти приемлемое представление» на стороне сервера. У кого-нибудь есть идеи, почему я получаю эту ошибку?

Клиент:

    Client client = ClientBuilder.newClient();
    WebTarget webTarget = client.target(query);  

    Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_OCTET_STREAM);
    response =  invocationBuilder.get();
    responseStatusCode = response.getStatus(); 

Сервер:

  @GetMapping(value = "/file", produces = 
  MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Response proceedRequest(@QueryParam(value = "filePath") String filePath,
                               @QueryParam(value = "offset") String offset,
                               @QueryParam(value = "length") String length) {
    LOGGER.info("File received, filePath: " + filePath + " offset: " + offset + " length: " + length);
    File file = new File(filePath);
    if(offset == null || length == null) return new ResponseGenerator().generateResponse(file);
    else return new ResponseGenerator().generateResponse(file, Integer.parseInt(offset), Integer.parseInt(length));
}



public Response generateResponse(File file, int offset, int length){
    StreamingOutput streamingOutput = new StreamingOutput() {
        @Override
        public void write(OutputStream outputStream) throws IOException, WebApplicationException {
            InputStream is = new FileInputStream(file);
            byte[] data = new byte[length];
            data = Files.readAllBytes(file.toPath());
            if(length >= is.available()) throw new IOException(" Length is too big");
            outputStream.write(data, offset, length);
            outputStream.flush();
        }
    };
    return Response
            .ok(streamingOutput, MediaType.APPLICATION_OCTET_STREAM_VALUE)
            .header("content-disposition","attachment; filename = myfile.pdf")
            .build();
}
...