可以使用proto中的bytes数据类型,将一个文件写入到bytes字段,然后传输,收到数据后,重新抽取bytes,组装成文件
proto文件
syntax = "proto3";
package gs.gmapping;
import "sensor.proto";
service Mapping {
rpc GetMappingResultFromFramePackageToFilePackage(FramePackage) returns (FilePackage) {}
}
message FramePackage {
repeated gs.sensor.Frame frame = 1;
}
message FilePackage{
repeated File file = 1;
}
message File{
string filename = 1;
uint32 size = 2;
bytes data = 3;
}
server端:
打开文件,并从文件读取数据,填充到bytes
ifstream tmpfile(data_file, ios::in | ios::binary | ios::ate);
if (tmpfile.is_open()) {
size_t length = tmpfile.tellg();
cout << data_file << " size: " << length << endl;
tmpfile.seekg(0, ios::beg);
char *data = new char[length];
tmpfile.read(data, length);
File *file = file_pkg->add_file();
file->set_filename(data_file);
file->set_data(data, length);
file->set_size(length);
delete data;
tmpfile.close();
} else {
cerr << data_file << " open failed" << endl;
return -1;
}
client端数据获取
读取proto格式数据,并将之读取到数组中,并回写文件
for (File file : file_pkg.file()) {
string local_str = CopyFileName(file.filename());
cout << "filename: " << local_str << endl;
// cout << "size: " << file.size() << endl;
ofstream tmpFile;
tmpFile.open(local_str);
if (tmpFile.is_open()) {
int length = file.size();
char *data = new char[length];
for (int i = 0; i < length; ++i) {
data[i] = (char) file.data()[i];
}
tmpFile.write(data, length);
tmpFile.close();
delete data;
cout << "write " << local_str << endl;
}
}
PS: 若各位有更好的想法,欢迎提出