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  }