如何使用 grpcurl 通过客户端流式 gRPC 分块上传图像

How to upload an image in chunks with client-side streaming gRPC using grpcurl

我一直在尝试使用 grpcurl 通过客户端流分块上传图像。该服务运行正常,除了在服务器上,接收到的图像数据为 0 字节。
我使用的命令是:

grpcurl -proto image_service.proto -v -d @ -plaintext localhost:3010 imageservice.ImageService.UploadImage < out

This link 提到块数据应该是 base64 编码,所以我的 out 文件的内容是:

{"chunk_data": "<base64 encoded image data>"}

This 正是我想要实现的目标,但是使用 grpcurl.
请告诉我的命令有什么问题,以及通过 grpcurl.
实现流式传输的最佳方法是什么 我还有 2 个问题:

  1. gRPC 是否处理数据块的拆分?
  2. 我怎样才能先发送元数据块(ImageInfo 类型),然后再通过 grpcurl 发送实际图像数据?

这是我的原型文件:

syntax = "proto3";
package imageservice;
import "google/protobuf/wrappers.proto";
option go_package = "...";

service ImageService {

  rpc UploadImage(stream UploadImageRequest) returns (UploadImageResponse) {}

}

message UploadImageRequest {
  oneof data {
    ImageInfo info = 1;
    bytes chunk_data = 3;
  };
}

message ImageInfo {
  string unique_id = 1;
  string image_type = 2;
}

message UploadImageResponse {
  string url = 1;
}

有趣的问题。我没有尝试使用(优秀的)grpcurl.

流式传输消息

文档没有解释如何做到这一点,但 this 问题显示了如何使用 stdin 进行流式传输。

我建议您先尝试这种方式,以确保适合您。

如果是这样,那么将各种消息捆绑到一个文件中 (out) 也应该可行。

你的后续问题表明你做错了。

  • chunk_data 将文件分割成块的结果;即这些 base64 编码的字符串中的每一个都应该是整个图像文件的一个子集(即一个块)。

  • 您的第一条消息应该是 { "info": "...." },后续消息将是 { "chunk_data": "<base64-encoded chunk>" },直到 EOF。