AppendObject - S3 Express Zone https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-append.html Note that appending on a server without append support may overwrite the object.
(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64, opts AppendObjectOptions, )
| 187 | // AppendObject - S3 Express Zone https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-append.html |
| 188 | // Note that appending on a server without append support may overwrite the object. |
| 189 | func (c *Client) AppendObject(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64, |
| 190 | opts AppendObjectOptions, |
| 191 | ) (info UploadInfo, err error) { |
| 192 | if objectSize < 0 && opts.ChunkSize == 0 { |
| 193 | return UploadInfo{}, errors.New("object size must be provided when no chunk size is provided") |
| 194 | } |
| 195 | |
| 196 | if err = opts.validate(c); err != nil { |
| 197 | return UploadInfo{}, err |
| 198 | } |
| 199 | |
| 200 | oinfo, err := c.StatObject(ctx, bucketName, objectName, StatObjectOptions{Checksum: true}) |
| 201 | if err != nil { |
| 202 | return UploadInfo{}, err |
| 203 | } |
| 204 | if oinfo.ChecksumMode != "" && oinfo.ChecksumMode != ChecksumFullObjectMode.String() { |
| 205 | return UploadInfo{}, fmt.Errorf("Append() is not allowed on objects that are not of FULL_OBJECT checksum type: %s", oinfo.ChecksumMode) |
| 206 | } |
| 207 | opts.setChecksumParams(oinfo) // set the appropriate checksum params based on the existing object checksum metadata. |
| 208 | opts.setWriteOffset(oinfo.Size) // First append must set the current object size as the offset. |
| 209 | |
| 210 | if opts.ChunkSize > 0 { |
| 211 | finalObjSize := int64(-1) |
| 212 | if objectSize > 0 { |
| 213 | finalObjSize = info.Size + objectSize |
| 214 | } |
| 215 | totalPartsCount, partSize, lastPartSize, err := OptimalPartInfo(finalObjSize, opts.ChunkSize) |
| 216 | if err != nil { |
| 217 | return UploadInfo{}, err |
| 218 | } |
| 219 | buf := make([]byte, partSize) |
| 220 | var partNumber int |
| 221 | for partNumber = 1; partNumber <= totalPartsCount; partNumber++ { |
| 222 | // Proceed to upload the part. |
| 223 | if partNumber == totalPartsCount { |
| 224 | partSize = lastPartSize |
| 225 | } |
| 226 | n, err := readFull(reader, buf) |
| 227 | if err != nil { |
| 228 | return info, err |
| 229 | } |
| 230 | if n != int(partSize) { |
| 231 | return info, io.ErrUnexpectedEOF |
| 232 | } |
| 233 | rd := newHook(bytes.NewReader(buf[:n]), opts.Progress) |
| 234 | uinfo, err := c.appendObjectDo(ctx, bucketName, objectName, rd, partSize, opts) |
| 235 | if err != nil { |
| 236 | return info, err |
| 237 | } |
| 238 | opts.setWriteOffset(uinfo.Size) |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | rd := newHook(reader, opts.Progress) |
| 243 | return c.appendObjectDo(ctx, bucketName, objectName, rd, objectSize, opts) |
| 244 | } |
nothing calls this directly
no test coverage detected