feat: implement client-side streaming file upload example and document it in GRPC.md

This commit is contained in:
2026-07-17 18:10:53 +09:00
parent 558f17eeed
commit fe913d7870
6 changed files with 367 additions and 43 deletions
+42
View File
@@ -37,6 +37,33 @@ func AskUpdateSensingData(ctx context.Context, m protoapi.IoTServiceClient, devi
return m.UpdateSensingData(ctx, request)
}
func AskUploadFile(ctx context.Context, m protoapi.IoTServiceClient, fileName string, fileData []byte) (*protoapi.UploadStatus, error) {
stream, err := m.UploadFile(ctx)
if err != nil {
return nil, err
}
chunkSize := 1024 // 1KB 단위 청크
totalBytes := len(fileData)
for i := 0; i < totalBytes; i += chunkSize {
end := i + chunkSize
if end > totalBytes {
end = totalBytes
}
err := stream.Send(&protoapi.FileChunk{
FileName: fileName,
Content: fileData[i:end],
})
if err != nil {
return nil, err
}
}
return stream.CloseAndRecv()
}
func ClientRun(addr string) {
conn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
@@ -67,4 +94,19 @@ func ClientRun(addr string) {
}
fmt.Println("Sensing Update Success:", res.Success)
fmt.Println("Sensing Update Message:", res.Message)
// 4단계: 파일 업로드 스트리밍 실행 예제
dummyData := make([]byte, 10240) // 10KB 가상 더미 데이터
for i := range dummyData {
dummyData[i] = byte(rand.Intn(256))
}
fmt.Println("Uploading dummy file (10KB) via Client Streaming...")
status, err := AskUploadFile(context.Background(), client, "firmware.bin", dummyData)
if err != nil {
fmt.Println("File upload failed:", err)
return
}
fmt.Println("Upload Success:", status.Success)
fmt.Println("Upload Message:", status.Message)
fmt.Printf("Uploaded Bytes: %d bytes\n", status.BytesUploaded)
}