如何使用 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 个问题:
- gRPC 是否处理数据块的拆分?
- 我怎样才能先发送元数据块(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。
我一直在尝试使用 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 个问题:
- gRPC 是否处理数据块的拆分?
- 我怎样才能先发送元数据块(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。