1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| package gateway
import ( "context" "fmt" "io" "net/http" "user/proto"
"github.com/golang/protobuf/jsonpb" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" )
func uploadHandle(w http.ResponseWriter, r *http.Request, pathParams map[string]string) { serviceAuthorization := r.Header.Get("Service-Authorization") fmt.Println(serviceAuthorization) err := r.ParseForm() if err != nil { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } file, header, err := r.FormFile("attachment") if err != nil { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } defer file.Close() conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } defer conn.Close() c := proto.NewUserClient(conn) ctx := context.Background() ctx = metadata.NewOutgoingContext(ctx, metadata.New(map[string]string{ "file_name": header.Filename, "service-authorization": serviceAuthorization, })) stream, err := c.Upload(ctx) if err != nil { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } buf := make([]byte, 100) for { n, err := file.Read(buf) if err != nil && err != io.EOF { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } if n == 0 { break } stream.Send(&proto.UploadRequest{ Content: buf[:n], Size: int64(n), }) } res, err := stream.CloseAndRecv() if err != nil && err != io.EOF { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } m := jsonpb.Marshaler{} str, err := m.MarshalToString(res) if err != nil && err != io.EOF { http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError) return } w.Header().Add("Content-Type", "application/json") fmt.Fprint(w, str) }
|