问题中提供的解决方案不适用于大尺寸文件。它只适用于较小的图像尺寸。 更好和标准的方法是使用chunking。 GRPC支持流内置的,所以它是很容易在块中,我们可以使用流媒体分块上述方式发送
syntax = 'proto3'
message UploadImageRequest{
bytes image = 1;
}
rpc UploadImage(stream UploadImageRequest) returns (Ack);
。
用于分块的所有语言提供了它自己的方式来基于块大小的块文件。
事情打理:
你需要处理的分块逻辑,流有助于自然发送。 如果你想发送元数据也有三种方法。
1:以下结构
message UploadImageRequest{
AuthToken auth = 1;
FileType image_format = 2;
bytes image = 3;
}
rpc UploadImage(stream UploadImageRequest) returns (Ack);
这里字节的使用仍然块和第一个块发送的authToken和文件类型以及所有其他请求只是不发送这些元数据。
2:您还可以使用oneof
这是更容易。
message UploadImageRequest{
oneof test_oneof {
Metadata meta = 2;
bytes image = 1;
}
}
message Metadata{
AuthToken auth = 1;
FileType image_format = 2;
}
rpc UploadImage(stream UploadImageRequest) returns (Ack);
3:只是使用以下结构与在第一组块发送的元数据和其他块将有数据。你需要在代码中处理。
syntax = 'proto3'
message UploadImageRequest{
bytes message = 1;
}
rpc UploadImage(stream UploadImageRequest) returns (Ack);
最后为auth你可以使用头,而不是发送消息。
您提到的gRPC文档中有哪些警告? –
@EricAnderson“协议缓冲区并不是为了处理大量消息而设计的,根据一般经验,如果您处理的消息大于每兆字节,则可能是考虑替代策略的时候了。” -https://developers.google.com/protocol-buffers/docs/techniques?hl = en –