如何在 grpc 中处理等效的 http.FormFile

问题描述

我对 grpc 很陌生,我正在将一些 http 处理程序重构为 grpc。在那里我找到了一个上传文件相关的处理程序。在请求中,它使用 http 多部分表单数据将文件作为 public static void wackyOutput(String wacky){ if(wacky.length() < 2){ return; } wacky = wacky.substring(1,wacky.length()); wackyOutput(wacky); System.out.print(wacky); } 发送。

我发现,有一种使用请求块数据流上传文件方法。但我需要的是避免流式传输并以无状态方式进行。

我已经搜索解决此问题的方法,但找不到解决方法。如果有人给我一个合适的解决方案来做到这一点,非常感谢

解决方法

Tl;博士

gRPC 并非旨在以与使用 http 多部分表单数据上传相同的方式处理大文件上传。 gRPC 有一个(稍微)任意的 4MB message limit(另见 this)。根据我的经验,正确的解决方案是不要将 gRPC 用于大文件上传。话虽如此,您可能可以尝试几种选择。

更改 gRPC 调用选项

您可以在拨打 gRPC 服务器时使用连接选项手动覆盖默认的 4MB 消息限制。例如,参见this

client,err := grpc.Dial("...",grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(4096)))

使用 gRPC 流

我需要使用 gRPC 进行文件上传,而无需更改默认消息限制选项,方法是实现 my own chunking package 以通过一元 gRPC 流为我处理它。您提到您想避免使用流,但是我将此作为资源提供给那些希望避免更改其 gRPC 消息限制的人。使用该库,您需要包装您的 gRPC 客户端。创建包装器后,您可以上传与 io.Reader 界面兼容的任何内容。

err := chunk.UploadFrom(reader,WrapUploadFileClient(client))