(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions)
| 57 | } |
| 58 | |
| 59 | func (c *Client) putObjectMultipartNoStream(ctx context.Context, bucketName, objectName string, reader io.Reader, opts PutObjectOptions) (info UploadInfo, err error) { |
| 60 | // Input validation. |
| 61 | if err = s3utils.CheckValidBucketName(bucketName); err != nil { |
| 62 | return UploadInfo{}, err |
| 63 | } |
| 64 | if err = s3utils.CheckValidObjectName(objectName); err != nil { |
| 65 | return UploadInfo{}, err |
| 66 | } |
| 67 | |
| 68 | // Total data read and written to server. should be equal to |
| 69 | // 'size' at the end of the call. |
| 70 | var totalUploadedSize int64 |
| 71 | |
| 72 | // Complete multipart upload. |
| 73 | var complMultipartUpload completeMultipartUpload |
| 74 | |
| 75 | // Calculate the optimal parts info for a given size. |
| 76 | totalPartsCount, partSize, _, err := OptimalPartInfo(-1, opts.PartSize) |
| 77 | if err != nil { |
| 78 | return UploadInfo{}, err |
| 79 | } |
| 80 | |
| 81 | // Choose hash algorithms to be calculated by hashCopyN, |
| 82 | // avoid sha256 with non-v4 signature request or |
| 83 | // HTTPS connection. |
| 84 | hashAlgos, hashSums := c.hashMaterials(opts.SendContentMd5, !opts.DisableContentSha256) |
| 85 | |
| 86 | // Initiate a new multipart upload. |
| 87 | uploadID, err := c.newUploadID(ctx, bucketName, objectName, opts) |
| 88 | if err != nil { |
| 89 | return UploadInfo{}, err |
| 90 | } |
| 91 | |
| 92 | defer func() { |
| 93 | if err != nil { |
| 94 | c.abortMultipartUpload(ctx, bucketName, objectName, uploadID) |
| 95 | } |
| 96 | }() |
| 97 | |
| 98 | // Part number always starts with '1'. |
| 99 | partNumber := 1 |
| 100 | |
| 101 | // Initialize parts uploaded map. |
| 102 | partsInfo := make(map[int]ObjectPart) |
| 103 | |
| 104 | // Create a buffer. |
| 105 | buf := make([]byte, partSize) |
| 106 | |
| 107 | // Create checksums |
| 108 | // CRC32C is ~50% faster on AMD64 @ 30GB/s |
| 109 | customHeader := make(http.Header) |
| 110 | crc := opts.AutoChecksum.Hasher() |
| 111 | for partNumber <= totalPartsCount { |
| 112 | length, rErr := readFull(reader, buf) |
| 113 | if rErr == io.EOF && partNumber > 1 { |
| 114 | break |
| 115 | } |
| 116 |
no test coverage detected