问题中提供的解决方案不适用于大尺寸文件。它仅适用于较小的图像尺寸。更好和标准的方法是使用分块。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 和 FileType,对于所有其他请求,只是不发送这些元数据。
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);
最后,对于身份验证,您可以使用标头而不是在消息中发送。