/// <inheritdoc/> public async Task <StorageObject> Create(string containerName, string objectName, IDictionary <string, string> metadata, Stream content, int numberOfSegments, string segmentsContainer) { containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a large storage object with a null or empty container name."); objectName.AssertIsNotNullOrEmpty("objectName", "Cannot create a large storage object with a null or empty name."); metadata.AssertIsNotNull("metadata", "Cannot create a large storage object with null metadata."); content.AssertIsNotNull("content", "Cannot create a large storage object with null content."); segmentsContainer.AssertIsNotNullOrEmpty("segmentsContainer", "Cannot create a large object with a null or empty segments container name."); if (numberOfSegments <= 0) { throw new ArgumentException("Cannot create a large object with zero or less segments.", "numberOfSegments"); } var segmentFolder = await this.GetSegmentsFolder(segmentsContainer, objectName); var chunkSize = this.GetChunkSize(content.Length, numberOfSegments); var lastSegmentAndId = this.GetLastSegmentIdAndName(segmentFolder); var lastSegmentId = lastSegmentAndId.Key; var lastSegmentFullName = string.Format("{0}/{1}", objectName, lastSegmentAndId.Value); var offset = lastSegmentId * chunkSize; if (lastSegmentId > 0) { //we should drop the last segment (as it's very possible it was corrupted) await StorageClient.DeleteStorageObject(segmentsContainer, lastSegmentFullName); } //Seek to the correct location based on whatever segments have been uploaded, if any content.Seek(offset, SeekOrigin.Begin); while (content.Position < content.Length) { //If the remaining data in the stream is less then the chunk size, reset the chunk size to the remaining data size. if ((content.Length - content.Position) < chunkSize) { chunkSize = (content.Length - content.Position); } await CreateSegment(content, chunkSize, objectName, lastSegmentId, metadata, segmentsContainer); lastSegmentId++; } var segments = await StorageClient.GetStorageFolder(segmentsContainer, objectName); return(await CreateLargeObjectManifest(containerName, objectName, metadata, segments.Objects, segmentsContainer)); }