github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/apis/api_post_object.go (about) 1 // THIS FILE IS GENERATED BY api-generator, DO NOT EDIT DIRECTLY! 2 3 package apis 4 5 import ( 6 "context" 7 "net/http" 8 "strconv" 9 "strings" 10 11 uplog "github.com/qiniu/go-sdk/v7/internal/uplog" 12 postobject "github.com/qiniu/go-sdk/v7/storagev2/apis/post_object" 13 errors "github.com/qiniu/go-sdk/v7/storagev2/errors" 14 httpclient "github.com/qiniu/go-sdk/v7/storagev2/http_client" 15 region "github.com/qiniu/go-sdk/v7/storagev2/region" 16 ) 17 18 type innerPostObjectRequest postobject.Request 19 20 func (form *innerPostObjectRequest) getBucketName(ctx context.Context) (string, error) { 21 putPolicy, err := form.UploadToken.GetPutPolicy(ctx) 22 if err != nil { 23 return "", err 24 } else { 25 return putPolicy.GetBucketName() 26 } 27 } 28 29 func (form *innerPostObjectRequest) getObjectName() string { 30 var objectName string 31 if form.ObjectName != nil { 32 objectName = *form.ObjectName 33 } 34 return objectName 35 } 36 37 func (form *innerPostObjectRequest) build(ctx context.Context) (*httpclient.MultipartForm, error) { 38 multipartForm := new(httpclient.MultipartForm) 39 if form.ObjectName != nil { 40 multipartForm.SetValue("key", *form.ObjectName) 41 } 42 if form.UploadToken != nil { 43 upToken, err := form.UploadToken.GetUpToken(ctx) 44 if err != nil { 45 return nil, err 46 } 47 multipartForm.SetValue("token", upToken) 48 } else { 49 return nil, errors.MissingRequiredFieldError{Name: "UploadToken"} 50 } 51 if form.Crc32 != 0 { 52 multipartForm.SetValue("crc32", strconv.FormatInt(form.Crc32, 10)) 53 } 54 if form.File.Data != nil { 55 if form.File.Name == "" { 56 return nil, errors.MissingRequiredFieldError{Name: "File.Name"} 57 } 58 multipartForm.SetFile("file", form.File.Name, form.File.ContentType, form.File.Data) 59 } else { 60 return nil, errors.MissingRequiredFieldError{Name: "File"} 61 } 62 for key, value := range form.CustomData { 63 multipartForm.SetValue(key, value) 64 } 65 return multipartForm, nil 66 } 67 68 func (request *innerPostObjectRequest) getAccessKey(ctx context.Context) (string, error) { 69 if request.UploadToken != nil { 70 if accessKey, err := request.UploadToken.GetAccessKey(ctx); err != nil { 71 return "", err 72 } else { 73 return accessKey, nil 74 } 75 } 76 return "", nil 77 } 78 79 type ( 80 PostObjectRequest = postobject.Request 81 PostObjectResponse = postobject.Response 82 ) 83 84 // 在一次 HTTP 会话中上传单一的一个文件 85 func (storage *Storage) PostObject(ctx context.Context, request *PostObjectRequest, options *Options) (*PostObjectResponse, error) { 86 if options == nil { 87 options = &Options{} 88 } 89 innerRequest := (*innerPostObjectRequest)(request) 90 serviceNames := []region.ServiceName{region.ServiceUp} 91 pathSegments := make([]string, 0) 92 path := "/" + strings.Join(pathSegments, "/") 93 var rawQuery string 94 headers := http.Header{} 95 body, err := innerRequest.build(ctx) 96 if err != nil { 97 return nil, err 98 } 99 bucketName := options.OverwrittenBucketName 100 if bucketName == "" { 101 var err error 102 if bucketName, err = innerRequest.getBucketName(ctx); err != nil { 103 return nil, err 104 } 105 } 106 objectName := innerRequest.getObjectName() 107 uplogInterceptor, err := uplog.NewRequestUplog("postObject", bucketName, objectName, nil) 108 if err != nil { 109 return nil, err 110 } 111 req := httpclient.Request{Method: "POST", ServiceNames: serviceNames, Path: path, RawQuery: rawQuery, Endpoints: options.OverwrittenEndpoints, Region: options.OverwrittenRegion, Interceptors: []httpclient.Interceptor{uplogInterceptor}, Header: headers, BufferResponse: true, RequestBody: httpclient.GetMultipartFormRequestBody(body), OnRequestProgress: options.OnRequestProgress} 112 if options.OverwrittenEndpoints == nil && options.OverwrittenRegion == nil && storage.client.GetRegions() == nil { 113 bucketHosts := httpclient.DefaultBucketHosts() 114 if bucketName != "" { 115 query := storage.client.GetBucketQuery() 116 if query == nil { 117 if options.OverwrittenBucketHosts != nil { 118 if bucketHosts, err = options.OverwrittenBucketHosts.GetEndpoints(ctx); err != nil { 119 return nil, err 120 } 121 } 122 queryOptions := region.BucketRegionsQueryOptions{UseInsecureProtocol: storage.client.UseInsecureProtocol(), AccelerateUploading: storage.client.AccelerateUploadingEnabled(), HostFreezeDuration: storage.client.GetHostFreezeDuration(), Resolver: storage.client.GetResolver(), Chooser: storage.client.GetChooser(), BeforeResolve: storage.client.GetBeforeResolveCallback(), AfterResolve: storage.client.GetAfterResolveCallback(), ResolveError: storage.client.GetResolveErrorCallback(), BeforeBackoff: storage.client.GetBeforeBackoffCallback(), AfterBackoff: storage.client.GetAfterBackoffCallback(), BeforeRequest: storage.client.GetBeforeRequestCallback(), AfterResponse: storage.client.GetAfterResponseCallback()} 123 if hostRetryConfig := storage.client.GetHostRetryConfig(); hostRetryConfig != nil { 124 queryOptions.RetryMax = hostRetryConfig.RetryMax 125 queryOptions.Backoff = hostRetryConfig.Backoff 126 } 127 if query, err = region.NewBucketRegionsQuery(bucketHosts, &queryOptions); err != nil { 128 return nil, err 129 } 130 } 131 if query != nil { 132 var accessKey string 133 var err error 134 if accessKey, err = innerRequest.getAccessKey(ctx); err != nil { 135 return nil, err 136 } 137 if accessKey == "" { 138 if credentialsProvider := storage.client.GetCredentials(); credentialsProvider != nil { 139 if creds, err := credentialsProvider.Get(ctx); err != nil { 140 return nil, err 141 } else if creds != nil { 142 accessKey = creds.AccessKey 143 } 144 } 145 } 146 if accessKey != "" { 147 req.Region = query.Query(accessKey, bucketName) 148 } 149 } 150 } 151 } 152 ctx = httpclient.WithoutSignature(ctx) 153 respBody := PostObjectResponse{Body: innerRequest.ResponseBody} 154 if err := storage.client.DoAndAcceptJSON(ctx, &req, &respBody); err != nil { 155 return nil, err 156 } 157 return &respBody, nil 158 }