为了账号安全,请及时绑定邮箱和手机立即绑定

无法创建生成的 HTTP 客户端所需的返回类型,因为没有从 ByteBuffer

无法创建生成的 HTTP 客户端所需的返回类型,因为没有从 ByteBuffer

牧羊人nacy 2023-09-20 17:03:32
下面是使用 micronaut 将文件作为休息响应发送到客户端的服务器端代码。@Get(value = "/downloadFile", produces = MediaType.APPLICATION_OCTET_STREAM )public HttpResponse<File> downloadDocument() throws IOException {    File sampleDocumentFile = new File(getClass().getClassLoader().getResource("SampleDocument.pdf").getFile());    return HttpResponse.ok(sampleDocumentFile).header("Content-Disposition", "attachment; filename=\"" + sampleDocumentFile.getName() + "\"" );}下面是调用上述端点的客户端。@Client(value = "/client")public interface DownloadDocumentClient {@Get(value = "/downloadDocument", processes = MediaType.APPLICATION_OCTET_STREAM)public Flowable<File> downloadDocument();}尝试检索文件如下:-Flowable<File> fileFlowable = downloadDocumentClient.downloadDocument();    Maybe<File> fileMaybe = fileFlowable.firstElement();    return fileMaybe.blockingGet();获取异常为io.micronaut.context.exceptions.ConfigurationException:无法创建生成的 HTTP 客户端所需的返回类型,因为没有注册从 ByteBuffer 到类 java.io.File 的 TypeConverter
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您无法使用实例发送文件数据File,因为它仅包含路径而不包含文件内容。您可以使用字节数组发送文件内容。


以这种方式更新控制器:


@Get(value = "/download", produces = MediaType.APPLICATION_OCTET_STREAM)

public HttpResponse<byte[]> downloadDocument() throws IOException, URISyntaxException {

    String documentName = "SampleDocument.pdf";

    byte[] content = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource(documentName).toURI()));

    return HttpResponse.ok(content).header("Content-Disposition", "attachment; filename=\"" + documentName + "\"");

}

那么客户端将会是这样的:


@Get(value = "/download", processes = MediaType.APPLICATION_OCTET_STREAM)

Flowable<byte[]> downloadDocument();

最后客户致电:


Flowable<byte[]> fileFlowable = downloadDocumentClient.downloadDocument();

Maybe<byte[]> fileMaybe = fileFlowable.firstElement();

byte[] content = fileMaybe.blockingGet();

更新: 如果您需要将接收到的字节(文件内容)保存到客户端计算机(容器)上的文件中,那么您可以这样做,例如:


Path targetPath = Files.write(Paths.get("target.pdf"), fileMaybe.blockingGet());

如果您确实需要实例File而不是Path进一步处理,那么只需:


File file = targetPath.toFile();


查看完整回答
反对 回复 2023-09-20
  • 1 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信