in sdk/storage/Azure.Storage.Blobs/src/BlobContainerClient.cs [3032:3532]
public virtual Response<BlobContentInfo> UploadBlob(
string blobName,
Stream content,
CancellationToken cancellationToken = default) =>
GetBlobClient(blobName)
.Upload(
content,
cancellationToken);
/// <summary>
/// The <see cref="UploadBlobAsync(string, Stream, CancellationToken)"/> operation creates a new block
/// blob.
///
/// For partial block blob updates and other advanced features, please
/// see <see cref="BlockBlobClient"/>. To create or modify page or
/// append blobs, please see <see cref="PageBlobClient"/> or
/// <see cref="AppendBlobClient"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/put-blob">
/// Put Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to upload.</param>
/// <param name="content">
/// A <see cref="Stream"/> containing the content to upload.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{BlobContentInfo}"/> describing the
/// state of the updated block blob.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown
/// if the blob already exists. To overwrite an existing block blob,
/// get a <see cref="BlobClient"/> by calling <see cref="GetBlobClient(string)"/>,
/// and then call <see cref="BlobClient.Upload(Stream, bool, CancellationToken)"/>
/// with the override parameter set to true.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual async Task<Response<BlobContentInfo>> UploadBlobAsync(
string blobName,
Stream content,
CancellationToken cancellationToken = default) =>
await GetBlobClient(blobName)
.UploadAsync(
content,
cancellationToken)
.ConfigureAwait(false);
/// <summary>
/// The <see cref="UploadBlob(string, BinaryData, CancellationToken)"/> operation creates a new block
/// blob.
///
/// For partial block blob updates and other advanced features, please
/// see <see cref="BlockBlobClient"/>. To create or modify page or
/// append blobs, please see <see cref="PageBlobClient"/> or
/// <see cref="AppendBlobClient"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/put-blob">
/// Put Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to upload.</param>
/// <param name="content">
/// A <see cref="BinaryData"/> containing the content to upload.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{BlobContentInfo}"/> describing the
/// state of the updated block blob.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown
/// if the blob already exists. To overwrite an existing block blob,
/// get a <see cref="BlobClient"/> by calling <see cref="GetBlobClient(string)"/>,
/// and then call <see cref="BlobClient.UploadAsync(Stream, bool, CancellationToken)"/>
/// with the override parameter set to true.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual Response<BlobContentInfo> UploadBlob(
string blobName,
BinaryData content,
CancellationToken cancellationToken = default) =>
GetBlobClient(blobName)
.Upload(
content,
cancellationToken);
/// <summary>
/// The <see cref="UploadBlobAsync(string, BinaryData, CancellationToken)"/> operation creates a new block
/// blob.
///
/// For partial block blob updates and other advanced features, please
/// see <see cref="BlockBlobClient"/>. To create or modify page or
/// append blobs, please see <see cref="PageBlobClient"/> or
/// <see cref="AppendBlobClient"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/put-blob">
/// Put Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to upload.</param>
/// <param name="content">
/// A <see cref="BinaryData"/> containing the content to upload.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{BlobContentInfo}"/> describing the
/// state of the updated block blob.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown
/// if the blob already exists. To overwrite an existing block blob,
/// get a <see cref="BlobClient"/> by calling <see cref="GetBlobClient(string)"/>,
/// and then call <see cref="BlobClient.Upload(Stream, bool, CancellationToken)"/>
/// with the override parameter set to true.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual async Task<Response<BlobContentInfo>> UploadBlobAsync(
string blobName,
BinaryData content,
CancellationToken cancellationToken = default) =>
await GetBlobClient(blobName)
.UploadAsync(
content,
cancellationToken)
.ConfigureAwait(false);
#endregion UploadBlob
#region DeleteBlob
/// <summary>
/// The <see cref="DeleteBlob"/> operation marks the specified
/// blob or snapshot for deletion.
///
/// Note that in order to delete a blob, you must delete all of its
/// snapshots. You can delete both at the same time using
/// <see cref="DeleteSnapshotsOption.IncludeSnapshots"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/delete-blob">
/// Delete Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to delete.</param>
/// <param name="snapshotsOption">
/// Specifies options for deleting blob snapshots.
/// </param>
/// <param name="conditions">
/// Optional <see cref="BlobRequestConditions"/> to add conditions on
/// deleting this blob.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response"/> on successfully marking for deletion.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual Response DeleteBlob(
string blobName,
DeleteSnapshotsOption snapshotsOption = default,
BlobRequestConditions conditions = default,
CancellationToken cancellationToken = default) =>
GetBlobClient(blobName)
.Delete(
snapshotsOption,
conditions,
cancellationToken);
/// <summary>
/// The <see cref="DeleteBlobAsync"/> operation marks the specified
/// blob or snapshot for deletion.
///
/// Note that in order to delete a blob, you must delete all of its
/// snapshots. You can delete both at the same time using
/// <see cref="DeleteSnapshotsOption.IncludeSnapshots"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/delete-blob">
/// Delete Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to delete.</param>
/// <param name="snapshotsOption">
/// Specifies options for deleting blob snapshots.
/// </param>
/// <param name="conditions">
/// Optional <see cref="BlobRequestConditions"/> to add conditions on
/// deleting this blob.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response"/> on successfully marking for deletion.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual async Task<Response> DeleteBlobAsync(
string blobName,
DeleteSnapshotsOption snapshotsOption = default,
BlobRequestConditions conditions = default,
CancellationToken cancellationToken = default) =>
await GetBlobClient(blobName)
.DeleteAsync(
snapshotsOption,
conditions,
cancellationToken)
.ConfigureAwait(false);
/// <summary>
/// The <see cref="DeleteBlobIfExists"/> operation marks the specified
/// blob or snapshot for deletion, if the blob or snapshot exists.
///
/// Note that in order to delete a blob, you must delete all of its
/// snapshots. You can delete both at the same time using
/// <see cref="DeleteSnapshotsOption.IncludeSnapshots"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/delete-blob">
/// Delete Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to delete.</param>
/// <param name="snapshotsOption">
/// Specifies options for deleting blob snapshots.
/// </param>
/// <param name="conditions">
/// Optional <see cref="BlobRequestConditions"/> to add conditions on
/// deleting this blob.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response"/> on successfully marking for deletion.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual Response<bool> DeleteBlobIfExists(
string blobName,
DeleteSnapshotsOption snapshotsOption = default,
BlobRequestConditions conditions = default,
CancellationToken cancellationToken = default) =>
GetBlobClient(blobName).
DeleteIfExists(
snapshotsOption,
conditions ?? default,
cancellationToken);
/// <summary>
/// The <see cref="DeleteBlobIfExistsAsync"/> operation marks the specified
/// blob or snapshot for deletion, if the blob or snapshot exists.
///
/// Note that in order to delete a blob, you must delete all of its
/// snapshots. You can delete both at the same time using
/// <see cref="DeleteSnapshotsOption.IncludeSnapshots"/>.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/rest/api/storageservices/delete-blob">
/// Delete Blob</see>.
/// </summary>
/// <param name="blobName">The name of the blob to delete.</param>
/// <param name="snapshotsOption">
/// Specifies options for deleting blob snapshots.
/// </param>
/// <param name="conditions">
/// Optional <see cref="BlobRequestConditions"/> to add conditions on
/// deleting this blob.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response"/> on successfully marking for deletion.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[ForwardsClientCalls]
public virtual async Task<Response<bool>> DeleteBlobIfExistsAsync(
string blobName,
DeleteSnapshotsOption snapshotsOption = default,
BlobRequestConditions conditions = default,
CancellationToken cancellationToken = default) =>
await GetBlobClient(blobName).DeleteIfExistsAsync(
snapshotsOption,
conditions ?? default,
cancellationToken)
.ConfigureAwait(false);
#endregion DeleteBlob
#region Rename
/// <summary>
/// Renames an existing Blob Container.
/// </summary>
/// <param name="destinationContainerName">
/// The name of the destination container.
/// </param>
/// <param name="sourceConditions">
/// Optional <see cref="BlobRequestConditions"/> that
/// source container has to meet to proceed with rename.
/// Note that LeaseId is the only request condition enforced by
/// this API.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{BlobContainerClient}"/> pointed at the renamed container.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
internal virtual Response<BlobContainerClient> Rename(
string destinationContainerName,
BlobRequestConditions sourceConditions = default,
CancellationToken cancellationToken = default)
=> RenameInternal(
destinationContainerName,
sourceConditions,
async: false,
cancellationToken: cancellationToken)
.EnsureCompleted();
/// <summary>
/// Renames an existing Blob Container.
/// </summary>
/// <param name="destinationContainerName">
/// The name of the destination container.
/// </param>
/// <param name="sourceConditions">
/// Optional <see cref="BlobRequestConditions"/> that
/// source container has to meet to proceed with rename.
/// Note that LeaseId is the only request condition enforced by
/// this API.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{BlobContainerClient}"/> pointed at the renamed container.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
internal virtual async Task<Response<BlobContainerClient>> RenameAsync(
string destinationContainerName,
BlobRequestConditions sourceConditions = default,
CancellationToken cancellationToken = default)
=> await RenameInternal(
destinationContainerName,
sourceConditions,
async: true,
cancellationToken)
.ConfigureAwait(false);
/// <summary>
/// Renames an existing Blob Container.
/// </summary>
/// <param name="destinationContainerName">
/// The new name of the Blob Container.
/// </param>
/// <param name="sourceConditions">
/// Optional <see cref="BlobRequestConditions"/> to add
/// conditions on the renaming of this container.
/// </param>
/// <param name="async">
/// Whether to invoke the operation asynchronously.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{BlobContainerClient}"/> pointed at the renamed container.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
internal async Task<Response<BlobContainerClient>> RenameInternal(
string destinationContainerName,
BlobRequestConditions sourceConditions,
bool async,
CancellationToken cancellationToken)
{
using (ClientConfiguration.Pipeline.BeginLoggingScope(nameof(BlobContainerClient)))
{
ClientConfiguration.Pipeline.LogMethodEnter(
nameof(BlobContainerClient),
message:
$"{nameof(Uri)}: {Uri}");
DiagnosticScope scope = ClientConfiguration.ClientDiagnostics.CreateScope($"{nameof(BlobContainerClient)}.{nameof(Rename)}");
sourceConditions.ValidateConditionsNotPresent(
invalidConditions:
BlobRequestConditionProperty.TagConditions
| BlobRequestConditionProperty.IfMatch
| BlobRequestConditionProperty.IfNoneMatch
| BlobRequestConditionProperty.IfModifiedSince
| BlobRequestConditionProperty.IfUnmodifiedSince,
operationName: nameof(BlobContainerClient.Rename),
parameterName: nameof(sourceConditions));
try
{
scope.Start();
BlobUriBuilder uriBuilder = new BlobUriBuilder(Uri, ClientConfiguration.TrimBlobNameSlashes)
{
BlobContainerName = destinationContainerName
};
BlobContainerClient destContainerClient = new BlobContainerClient(
uriBuilder.ToUri(),
ClientConfiguration,
AuthenticationPolicy,
ClientSideEncryption);
ResponseWithHeaders<ContainerRenameHeaders> response;
if (async)
{
response = await destContainerClient.ContainerRestClient.RenameAsync(
sourceContainerName: Name,
sourceLeaseId: sourceConditions?.LeaseId,
cancellationToken: cancellationToken)
.ConfigureAwait(false);
}
else
{
response = destContainerClient.ContainerRestClient.Rename(
sourceContainerName: Name,
sourceLeaseId: sourceConditions?.LeaseId,
cancellationToken: cancellationToken);
}
return Response.FromValue(
destContainerClient,
response);
}
catch (Exception ex)
{
ClientConfiguration.Pipeline.LogException(ex);
scope.Failed(ex);
throw;
}
finally
{
ClientConfiguration.Pipeline.LogMethodExit(nameof(BlobContainerClient));
scope.Dispose();
}
}
}