initiateMultipartUpload - Initiates a multipart upload and returns an upload ID.
(ctx context.Context, bucketName, objectName string, opts PutObjectOptions)
| 219 | |
| 220 | // initiateMultipartUpload - Initiates a multipart upload and returns an upload ID. |
| 221 | func (c *Client) initiateMultipartUpload(ctx context.Context, bucketName, objectName string, opts PutObjectOptions) (initiateMultipartUploadResult, error) { |
| 222 | // Input validation. |
| 223 | if err := s3utils.CheckValidBucketName(bucketName); err != nil { |
| 224 | return initiateMultipartUploadResult{}, err |
| 225 | } |
| 226 | if err := s3utils.CheckValidObjectName(objectName); err != nil { |
| 227 | return initiateMultipartUploadResult{}, err |
| 228 | } |
| 229 | |
| 230 | // Initialize url queries. |
| 231 | urlValues := make(url.Values) |
| 232 | urlValues.Set("uploads", "") |
| 233 | |
| 234 | if opts.Internal.SourceVersionID != "" { |
| 235 | if opts.Internal.SourceVersionID != nullVersionID { |
| 236 | if _, err := uuid.Parse(opts.Internal.SourceVersionID); err != nil { |
| 237 | return initiateMultipartUploadResult{}, errInvalidArgument(err.Error()) |
| 238 | } |
| 239 | } |
| 240 | urlValues.Set("versionId", opts.Internal.SourceVersionID) |
| 241 | } |
| 242 | |
| 243 | // Set ContentType header. |
| 244 | customHeader := opts.Header() |
| 245 | |
| 246 | reqMetadata := requestMetadata{ |
| 247 | bucketName: bucketName, |
| 248 | objectName: objectName, |
| 249 | queryValues: urlValues, |
| 250 | customHeader: customHeader, |
| 251 | } |
| 252 | |
| 253 | // Execute POST on an objectName to initiate multipart upload. |
| 254 | resp, err := c.executeMethod(ctx, http.MethodPost, reqMetadata) |
| 255 | defer closeResponse(resp) |
| 256 | if err != nil { |
| 257 | return initiateMultipartUploadResult{}, err |
| 258 | } |
| 259 | if resp != nil { |
| 260 | if resp.StatusCode != http.StatusOK { |
| 261 | return initiateMultipartUploadResult{}, httpRespToErrorResponse(resp, bucketName, objectName) |
| 262 | } |
| 263 | } |
| 264 | // Decode xml for new multipart upload. |
| 265 | initiateMultipartUploadResult := initiateMultipartUploadResult{} |
| 266 | err = xmlDecoder(resp.Body, &initiateMultipartUploadResult) |
| 267 | if err != nil { |
| 268 | return initiateMultipartUploadResult, err |
| 269 | } |
| 270 | return initiateMultipartUploadResult, nil |
| 271 | } |
| 272 | |
| 273 | type uploadPartParams struct { |
| 274 | bucketName string |