public void UploadFromStream(Stream source, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null) { CommonUtils.AssertNotNull("source", source); this.attributes.AssertNoSnapshot(); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.PageBlob, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); if (!source.CanSeek) { throw new InvalidOperationException(); } long size = source.Length - source.Position; if ((size % Constants.PageSize) != 0) { throw new ArgumentException(SR.InvalidPageSize, "source"); } using (Stream blobStream = this.OpenWrite(size, accessCondition, modifiedOptions, operationContext)) { DateTime? expiryTime = modifiedOptions.MaximumExecutionTime.HasValue ? DateTime.Now + modifiedOptions.MaximumExecutionTime.Value : (DateTime?)null; source.WriteToSync(blobStream, null /* maxLength */, expiryTime, false, true, new OperationContext(), null /* streamCopyState */); } }
internal void UploadFromStreamHelper(Stream source, long? length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) { CommonUtility.AssertNotNull("source", source); if (length.HasValue) { CommonUtility.AssertInBounds("length", length.Value, 1); if (source.CanSeek && length > source.Length - source.Position) { throw new ArgumentOutOfRangeException("length", SR.StreamLengthShortError); } } this.attributes.AssertNoSnapshot(); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.BlockBlob, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); bool lessThanSingleBlobThreshold = source.CanSeek && (length ?? source.Length - source.Position) <= this.ServiceClient.SingleBlobUploadThresholdInBytes; if (this.ServiceClient.ParallelOperationThreadCount == 1 && lessThanSingleBlobThreshold) { string contentMD5 = null; if (modifiedOptions.StoreBlobContentMD5.Value) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { StreamDescriptor streamCopyState = new StreamDescriptor(); long startPosition = source.Position; source.WriteToSync(Stream.Null, length, null /* maxLength */, true, true, tempExecutionState, streamCopyState); source.Position = startPosition; contentMD5 = streamCopyState.Md5; } } else { // Throw exception if we need to use Transactional MD5 but cannot store it if (modifiedOptions.UseTransactionalMD5.Value) { throw new ArgumentException(SR.PutBlobNeedsStoreBlobContentMD5, "options"); } } Executor.ExecuteSync( this.PutBlobImpl(source, length, contentMD5, accessCondition, modifiedOptions), modifiedOptions.RetryPolicy, operationContext); } else { using (CloudBlobStream blobStream = this.OpenWrite(accessCondition, modifiedOptions, operationContext)) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { source.WriteToSync(blobStream, length, null /* maxLength */, false, true, tempExecutionState, null /* streamCopyState */); blobStream.Commit(); } } } }
public void WritePages(Stream pageData, long startOffset, string contentMD5 = null, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null) { BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.PageBlob, this.ServiceClient); bool requiresContentMD5 = (contentMD5 == null) && modifiedOptions.UseTransactionalMD5.Value; operationContext = operationContext ?? new OperationContext(); Stream seekableStream = pageData; if (!pageData.CanSeek || requiresContentMD5) { OperationContext tempOperationContext = new OperationContext(); DateTime? expiryTime = modifiedOptions.MaximumExecutionTime.HasValue ? DateTime.Now + modifiedOptions.MaximumExecutionTime.Value : (DateTime?)null; Stream writeToStream; if (pageData.CanSeek) { writeToStream = Stream.Null; } else { seekableStream = new MemoryStream(); writeToStream = seekableStream; } long startPosition = seekableStream.Position; StreamDescriptor streamCopyState = new StreamDescriptor(); pageData.WriteToSync(writeToStream, Constants.MaxBlockSize, expiryTime, requiresContentMD5, true, tempOperationContext, streamCopyState); seekableStream.Position = startPosition; if (requiresContentMD5) { contentMD5 = streamCopyState.Md5; } } Executor.ExecuteSync( this.PutPageImpl(seekableStream, startOffset, contentMD5, accessCondition, modifiedOptions), modifiedOptions.RetryPolicy, operationContext); }
/// <summary> /// Uploads a stream to a page blob. If the blob already exists, it will be overwritten. /// </summary> /// <param name="source">A <see cref="System.IO.Stream"/> object providing the blob content.</param> /// <param name="length">The number of bytes to write from the source stream at its current position.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the condition that must be met in order for the request to proceed. If <c>null</c>, no condition is used.</param> /// <param name="options">A <see cref="BlobRequestOptions"/> object that specifies additional options for the request.</param> /// <param name="operationContext">An <see cref="OperationContext"/> object that represents the context for the current operation.</param> internal void UploadFromStreamHelper(Stream source, long? length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) { CommonUtility.AssertNotNull("source", source); if (!source.CanSeek) { throw new InvalidOperationException(); } if (length.HasValue) { CommonUtility.AssertInBounds("length", length.Value, 1, source.Length - source.Position); } else { length = source.Length - source.Position; } if ((length % Constants.PageSize) != 0) { throw new ArgumentException(SR.InvalidPageSize, "source"); } this.attributes.AssertNoSnapshot(); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.PageBlob, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); using (CloudBlobStream blobStream = this.OpenWrite(length, accessCondition, modifiedOptions, operationContext)) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { source.WriteToSync(blobStream, length, null /* maxLength */, false, true, tempExecutionState, null /* streamCopyState */); blobStream.Commit(); } } }
public void PutBlock(string blockId, Stream blockData, string contentMD5, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null) { CommonUtility.AssertNotNull("blockData", blockData); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.BlockBlob, this.ServiceClient); bool requiresContentMD5 = (contentMD5 == null) && modifiedOptions.UseTransactionalMD5.Value; operationContext = operationContext ?? new OperationContext(); Stream seekableStream = blockData; if (!blockData.CanSeek || requiresContentMD5) { ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions); Stream writeToStream; if (blockData.CanSeek) { writeToStream = Stream.Null; } else { seekableStream = new MultiBufferMemoryStream(this.ServiceClient.BufferManager); writeToStream = seekableStream; } long startPosition = seekableStream.Position; StreamDescriptor streamCopyState = new StreamDescriptor(); blockData.WriteToSync(writeToStream, null /* copyLength */, Constants.MaxBlockSize, requiresContentMD5, true, tempExecutionState, streamCopyState); seekableStream.Position = startPosition; if (requiresContentMD5) { contentMD5 = streamCopyState.Md5; } } Executor.ExecuteSync( this.PutBlockImpl(seekableStream, blockId, contentMD5, accessCondition, modifiedOptions), modifiedOptions.RetryPolicy, operationContext); }
internal void UploadFromStreamHelper(Stream source, long? length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) { CommonUtility.AssertNotNull("source", source); if (length.HasValue) { CommonUtility.AssertInBounds("length", length.Value, 1); if (source.CanSeek && length > source.Length - source.Position) { throw new ArgumentOutOfRangeException("length", SR.StreamLengthShortError); } } this.attributes.AssertNoSnapshot(); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.BlockBlob, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); bool lessThanSingleBlobThreshold = CloudBlockBlob.IsLessThanSingleBlobThreshold(source, length, modifiedOptions, false); modifiedOptions.AssertPolicyIfRequired(); if (modifiedOptions.ParallelOperationThreadCount.Value == 1 && lessThanSingleBlobThreshold) { bool usingEncryption = modifiedOptions.EncryptionPolicy != null; Stream sourceStream = source; using (MemoryStream tempStream = !usingEncryption ? null : new MemoryStream()) { // Encrypt if necessary if (usingEncryption) { modifiedOptions.AssertPolicyIfRequired(); if (modifiedOptions.EncryptionPolicy.EncryptionMode != BlobEncryptionMode.FullBlob) { throw new InvalidOperationException(SR.InvalidEncryptionMode, null); } ICryptoTransform transform = modifiedOptions.EncryptionPolicy.CreateAndSetEncryptionContext(this.Metadata, false /* noPadding */); CryptoStream cryptoStream = new CryptoStream(tempStream, transform, CryptoStreamMode.Write); using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(options)) { source.WriteToSync(cryptoStream, length, null, false, true, tempExecutionState, null); cryptoStream.FlushFinalBlock(); } // After the tempStream has been written to, we need to seek back to the beginning, so that it can be read from. tempStream.Seek(0, SeekOrigin.Begin); length = tempStream.Length; sourceStream = tempStream; } // Calculate MD5 if necessary // Note that we cannot do this while we encrypt, it must be a separate step, because we want the MD5 of the encrypted data, // not the unencrypted data. string contentMD5 = null; if (modifiedOptions.StoreBlobContentMD5.Value) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { StreamDescriptor streamCopyState = new StreamDescriptor(); long startPosition = sourceStream.Position; sourceStream.WriteToSync(Stream.Null, length, null /* maxLength */, true, true, tempExecutionState, streamCopyState); sourceStream.Position = startPosition; contentMD5 = streamCopyState.Md5; } } else { // Throw exception if we need to use Transactional MD5 but cannot store it if (modifiedOptions.UseTransactionalMD5.Value) { throw new ArgumentException(SR.PutBlobNeedsStoreBlobContentMD5, "options"); } } // Execute the put blob. Executor.ExecuteSync( this.PutBlobImpl(sourceStream, length, contentMD5, accessCondition, modifiedOptions), modifiedOptions.RetryPolicy, operationContext); } } else { using (CloudBlobStream blobStream = this.OpenWrite(accessCondition, modifiedOptions, operationContext)) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { source.WriteToSync(blobStream, length, null /* maxLength */, false, true, tempExecutionState, null /* streamCopyState */); blobStream.Commit(); } } } }
/// <summary> /// Uploads a stream to an append blob. If the blob already exists, it will be overwritten. /// </summary> /// <param name="source">A <see cref="System.IO.Stream"/> object providing the blob content.</param> /// <param name="length">The number of bytes to write from the source stream at its current position.</param> /// <param name="createNew"><c>true</c> if the append blob is newly created, <c>false</c> otherwise.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the condition that must be met in order for the request to proceed. If <c>null</c>, no condition is used.</param> /// <param name="options">A <see cref="BlobRequestOptions"/> object that specifies additional options for the request.</param> /// <param name="operationContext">An <see cref="OperationContext"/> object that represents the context for the current operation.</param> internal void UploadFromStreamHelper(Stream source, long? length, bool createNew, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) { CommonUtility.AssertNotNull("source", source); if (length.HasValue) { CommonUtility.AssertInBounds("length", length.Value, 1); if (source.CanSeek && length > source.Length - source.Position) { throw new ArgumentOutOfRangeException("length", SR.StreamLengthShortError); } } this.attributes.AssertNoSnapshot(); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.AppendBlob, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); using (CloudBlobStream blobStream = this.OpenWrite(createNew, accessCondition, modifiedOptions, operationContext)) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { source.WriteToSync(blobStream, length, null /* maxLength */, false, true, tempExecutionState, null /* streamCopyState */); blobStream.Commit(); } } }
public virtual void WriteRange(Stream rangeData, long startOffset, string contentMD5 = null, AccessCondition accessCondition = null, FileRequestOptions options = null, OperationContext operationContext = null) { CommonUtility.AssertNotNull("rangeData", rangeData); FileRequestOptions modifiedOptions = FileRequestOptions.ApplyDefaults(options, this.ServiceClient); bool requiresContentMD5 = (contentMD5 == null) && modifiedOptions.UseTransactionalMD5.Value; operationContext = operationContext ?? new OperationContext(); Stream seekableStream = rangeData; bool seekableStreamCreated = false; try { if (!rangeData.CanSeek || requiresContentMD5) { ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions); Stream writeToStream; if (rangeData.CanSeek) { writeToStream = Stream.Null; } else { seekableStream = new MultiBufferMemoryStream(this.ServiceClient.BufferManager); seekableStreamCreated = true; writeToStream = seekableStream; } long startPosition = seekableStream.Position; StreamDescriptor streamCopyState = new StreamDescriptor(); rangeData.WriteToSync(writeToStream, null /* copyLength */, Constants.MaxBlockSize, requiresContentMD5, true, tempExecutionState, streamCopyState); seekableStream.Position = startPosition; if (requiresContentMD5) { contentMD5 = streamCopyState.Md5; } } Executor.ExecuteSync( this.PutRangeImpl(seekableStream, startOffset, contentMD5, accessCondition, modifiedOptions), modifiedOptions.RetryPolicy, operationContext); } finally { if (seekableStreamCreated) { seekableStream.Dispose(); } } }
/// <summary> /// Uploads a stream to a file. If the file already exists on the service, it will be overwritten. /// </summary> /// <param name="source">The stream providing the file content.</param> /// <param name="length">The number of bytes to write from the source stream at its current position.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the access conditions for the file. If <c>null</c>, no condition is used.</param> /// <param name="options">A <see cref="FileRequestOptions"/> object that specifies additional options for the request.</param> /// <param name="operationContext">An <see cref="OperationContext"/> object that represents the context for the current operation.</param> internal void UploadFromStreamHelper(Stream source, long? length, AccessCondition accessCondition, FileRequestOptions options, OperationContext operationContext) { CommonUtility.AssertNotNull("source", source); if (!source.CanSeek) { throw new InvalidOperationException(); } if (length.HasValue) { CommonUtility.AssertInBounds("length", length.Value, 1, source.Length - source.Position); } else { length = source.Length - source.Position; } FileRequestOptions modifiedOptions = FileRequestOptions.ApplyDefaults(options, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); using (CloudFileStream fileStream = this.OpenWrite(length, accessCondition, modifiedOptions, operationContext)) { using (ExecutionState<NullType> tempExecutionState = CommonUtility.CreateTemporaryExecutionState(modifiedOptions)) { source.WriteToSync(fileStream, length, null /* maxLength */, false, true, tempExecutionState, null /* streamCopyState */); fileStream.Commit(); } } }
public void UploadFromStream(Stream source, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null) { CommonUtils.AssertNotNull("source", source); this.attributes.AssertNoSnapshot(); BlobRequestOptions modifiedOptions = BlobRequestOptions.ApplyDefaults(options, BlobType.BlockBlob, this.ServiceClient); operationContext = operationContext ?? new OperationContext(); DateTime? expiryTime = modifiedOptions.MaximumExecutionTime.HasValue ? DateTime.Now + modifiedOptions.MaximumExecutionTime.Value : (DateTime?)null; if ((this.ServiceClient.ParallelOperationThreadCount == 1) && source.CanSeek && ((source.Length - source.Position) <= this.ServiceClient.SingleBlobUploadThresholdInBytes)) { string contentMD5 = null; if (modifiedOptions.StoreBlobContentMD5.Value) { OperationContext tempOperationContext = new OperationContext(); StreamDescriptor streamCopyState = new StreamDescriptor(); long startPosition = source.Position; source.WriteToSync(Stream.Null, null /* maxLength */, expiryTime, true, true, tempOperationContext, streamCopyState); source.Position = startPosition; contentMD5 = streamCopyState.Md5; } Executor.ExecuteSync( this.PutBlobImpl(source, contentMD5, accessCondition, modifiedOptions), modifiedOptions.RetryPolicy, operationContext); } else { using (Stream blobStream = this.OpenWrite(accessCondition, modifiedOptions, operationContext)) { source.WriteToSync(blobStream, null /* maxLength */, expiryTime, false, true, new OperationContext(), null /* streamCopyState */); } } }