Micronaut客户端接收控制器文件流问题:如何获取返回流而非字符串?
解决客户端获取Controller返回文件流的问题
你的Controller已经正确用StreamedFile包装并返回了文件流,问题出在客户端的调用逻辑上——retrieve()方法默认会把响应体自动解析成字符串,所以你只能拿到文本内容,而非原始的文件流。咱们调整下客户端代码就能搞定:
方法一:直接获取输入流
用exchange()替代retrieve(),并指定响应体处理器为ofInputStream(),这样就能拿到Controller返回的原始流:
@Inject @Client("${agent.connection-url}") private RxHttpClient client; public InputStream getBackup(String dataBaseName) { // 发送请求并指定用输入流处理响应体 HttpResponse<InputStream> response = client.toBlocking().exchange( HttpRequest.GET("/backup/" + dataBaseName), HttpResponse.BodyHandlers.ofInputStream() ); // 先检查响应状态码,确保请求成功 if (!response.statusCode().is2xxSuccessful()) { throw new RuntimeException("备份获取失败,状态码:" + response.statusCode()); } return response.body(); }
拿到流之后,记得用try-with-resources语句自动关闭流,避免资源泄漏,比如把流写入本地文件:
public void saveBackupToFile(String dataBaseName, String savePath) throws IOException { try (InputStream inputStream = getBackup(dataBaseName); FileOutputStream outputStream = new FileOutputStream(savePath)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } }
方法二:直接获取StreamedFile对象
如果你的客户端项目也引入了StreamedFile类,也可以直接让客户端解析成该对象:
public StreamedFile getBackup(String dataBaseName) { HttpResponse<StreamedFile> response = client.toBlocking().exchange( HttpRequest.GET("/backup/" + dataBaseName), HttpResponse.BodyHandlers.ofObject(StreamedFile.class) ); if (!response.statusCode().is2xxSuccessful()) { throw new RuntimeException("备份获取失败,状态码:" + response.statusCode()); } return response.body(); }
这种方式更贴合Controller的返回类型,后续可以直接通过StreamedFile的方法获取流、文件名等信息。
内容的提问来源于stack exchange,提问作者davebo92123
相关产品推荐
相关产品推荐

