Here how to do multipart upload to Amazon S3 Storgae with c# If you have a stream that is broken up into 10 chunks you will be hitting this method 10 times, on the first chunk you will hit step 1 & 2, chunks 2-9 only step 2 and on the last only step 3. Your need to send back to your client the upload id and the etag for each response. At step 3 you will need to provide the etag for all pieces or else it will put together the file on S3 without 1 more pieces. On my client side I had a hidden field where I persisted the etag list (comma delimited).
public UploadPartResponse UploadChunk(Stream stream, string fileName, string uploadId, List<PartETag> eTags, int partNumber, bool lastPart) { stream.Position = 0; //Step 1: build and send a multi upload request if (partNumber == 1) { var initiateRequest = new InitiateMultipartUploadRequest { BucketName = _settings.Bucket, Key = fileName }; var initResponse = _s3Client.InitiateMultipartUpload(initiateRequest); uploadId = initResponse.UploadId; } //Step 2: upload each chunk (this is run for every chunk unlike the other steps which are run once) var uploadRequest = new UploadPartRequest { BucketName = _settings.Bucket, Key = fileName, UploadId = uploadId, PartNumber = partNumber, InputStream = stream, IsLastPart = lastPart, PartSize = stream.Length }; var response = _s3Client.UploadPart(uploadRequest); //Step 3: build and send the multipart complete request if (lastPart) { eTags.Add(new PartETag { PartNumber = partNumber, ETag = response.ETag }); var completeRequest = new CompleteMultipartUploadRequest { BucketName = _settings.Bucket, Key = fileName, UploadId = uploadId, PartETags = eTags }; try { _s3Client.CompleteMultipartUpload(completeRequest); } catch { //do some logging and return null response return null; } } response.ResponseMetadata.Metadata["uploadid"] = uploadRequest.UploadId; return response; }
Comments