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

问题描述

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

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

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

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

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

  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;
}

解决方法

有趣的问题。我还没有尝试过使用(优秀的)webpack.mix.js 流式传输消息。

文档没有解释如何执行此操作,但 this 问题显示了如何使用 stdin 进行流式传输。

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

如果是这样,那么将各种消息捆绑到一个文件 (quotient = int (input('State the quotient of',str(first),'divided by',str(second)) ) 中也应该可行。

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

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

  • 您的第一条消息应该是 out,后续消息将是 chunk_data,直到 EOF。