Я хочу, чтобы мой сервер передавал файл обратно клиенту 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();
}