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
+28 -1
View File
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"grpccanary/examples/grpcentity/protoapi"
"io"
"math/rand"
"net"
"time"
@@ -85,6 +86,32 @@ func (IoTServer) GetRandomPass(ctx context.Context, r *protoapi.RequestPass) (*p
return response, nil
}
func (IoTServer) UploadFile(stream protoapi.IoTService_UploadFileServer) error {
var totalBytes int64
var fileName string
for {
chunk, err := stream.Recv()
if err == io.EOF {
fmt.Printf("File upload completed. Received %d bytes for file '%s'\n", totalBytes, fileName)
return stream.SendAndClose(&protoapi.UploadStatus{
Success: true,
Message: fmt.Sprintf("File '%s' uploaded successfully.", fileName),
BytesUploaded: totalBytes,
})
}
if err != nil {
fmt.Println("File upload error:", err)
return err
}
if fileName == "" {
fileName = chunk.GetFileName()
}
totalBytes += int64(len(chunk.GetContent()))
}
}
func ServerRun(addr string) {
server := grpc.NewServer()
var iotServer IoTServer
@@ -92,7 +119,7 @@ func ServerRun(addr string) {
reflection.Register(server)
listen, err := net.Listen("tcp", port)
listen, err := net.Listen("tcp", addr)
if err != nil {
fmt.Println(err)
return