(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions)
| 391 | } |
| 392 | |
| 393 | func (c *Client) putObjectMultipartStreamNoLength(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions) (info UploadInfo, err error) { |
| 394 | // Input validation. |
| 395 | if err = s3utils.CheckValidBucketName(bucketName); err != nil { |
| 396 | return UploadInfo{}, err |
| 397 | } |
| 398 | if err = s3utils.CheckValidObjectName(objectName); err != nil { |
| 399 | return UploadInfo{}, err |
| 400 | } |
| 401 | |
| 402 | // Total data read and written to server. should be equal to |
| 403 | // 'size' at the end of the call. |
| 404 | var totalUploadedSize int64 |
| 405 | |
| 406 | // Complete multipart upload. |
| 407 | var complMultipartUpload completeMultipartUpload |
| 408 | |
| 409 | // Calculate the optimal parts info for a given size. |
| 410 | totalPartsCount, partSize, _, err := OptimalPartInfo(-1, opts.PartSize) |
| 411 | if err != nil { |
| 412 | return UploadInfo{}, err |
| 413 | } |
| 414 | |
| 415 | // Initiate a new multipart upload. |
| 416 | uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) |
| 417 | if err != nil { |
| 418 | return UploadInfo{}, err |
| 419 | } |
| 420 | |
| 421 | defer func() { |
| 422 | if err != nil { |
| 423 | c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) |
| 424 | } |
| 425 | }() |
| 426 | |
| 427 | // Part number always starts with '1'. |
| 428 | partNumber := 1 |
| 429 | |
| 430 | // Initialize parts uploaded map. |
| 431 | partsInfo := make(map[int]ObjectPart) |
| 432 | |
| 433 | // Create a buffer. |
| 434 | buf := make([]byte, partSize) |
| 435 | |
| 436 | // Create checksums |
| 437 | // CRC32C is ~50% faster on AMD64 @ 30GB/s |
| 438 | customHeader := make(http.Header) |
| 439 | crc := opts.AutoChecksum.Hasher() |
| 440 | |
| 441 | for partNumber <= totalPartsCount { |
| 442 | length, rerr := readFull(reader, buf) |
| 443 | if rerr == io.EOF && partNumber > 1 { |
| 444 | break |
| 445 | } |
| 446 | |
| 447 | if rerr != nil && rerr != io.ErrUnexpectedEOF && rerr != io.EOF { |
| 448 | return UploadInfo{}, rerr |
| 449 | } |
| 450 |
no test coverage detected