public static string DownloadText(this BlobBaseClient blobClient, CancellationToken cancellationToken = default) { using BlobDownloadInfo blobDownloadInfo = blobClient.Download(cancellationToken); using Stream stream = blobDownloadInfo.Content; using StreamReader streamReader = new StreamReader(stream); return(streamReader.ReadToEnd()); }
public T GetBlob <T>() { BlobDownloadInfo download = _blobClient.Download(); var stream = new MemoryStream(); download.Content.CopyTo(stream); var bytes = stream.ToArray(); var stringObject = Encoding.UTF8.GetString(bytes); return(JsonConvert.DeserializeObject <T>(stringObject)); }
public Response DownloadTo( Stream destination, BlobRequestConditions conditions, CancellationToken cancellationToken) { // Wrap the download range calls in a Download span for distributed // tracing DiagnosticScope scope = _client.ClientDiagnostics.CreateScope($"{nameof(BlobBaseClient)}.{nameof(BlobBaseClient.DownloadTo)}"); try { scope.Start(); // Just start downloading using an initial range. If it's a // small blob, we'll get the whole thing in one shot. If it's // a large blob, we'll get its full size in Content-Range and // can keep downloading it in segments. var initialRange = new HttpRange(0, _initialRangeSize); Response <BlobDownloadInfo> initialResponse = _client.Download( initialRange, conditions, rangeGetContentHash: false, cancellationToken); // If the initial request returned no content (i.e., a 304), // we'll pass that back to the user immediately if (initialResponse.IsUnavailable()) { return(initialResponse.GetRawResponse()); } // Copy the first segment to the destination stream CopyTo(initialResponse, destination, cancellationToken); // If the first segment was the entire blob, we're finished now long initialLength = initialResponse.Value.ContentLength; long totalLength = ParseRangeTotalLength(initialResponse.Value.Details.ContentRange); if (initialLength == totalLength) { return(initialResponse.GetRawResponse()); } // Capture the etag from the first segment and construct // conditions to ensure the blob doesn't change while we're // downloading the remaining segments ETag etag = initialResponse.Value.Details.ETag; BlobRequestConditions conditionsWithEtag = CreateConditionsWithEtag(conditions, etag); // Download each of the remaining ranges in the blob foreach (HttpRange httpRange in GetRanges(initialLength, totalLength)) { // Don't need to worry about 304s here because the ETag // condition will turn into a 412 and throw a proper // RequestFailedException Response <BlobDownloadInfo> result = _client.Download( httpRange, conditionsWithEtag, rangeGetContentHash: false, cancellationToken); CopyTo(result.Value, destination, cancellationToken); } return(initialResponse.GetRawResponse()); } catch (Exception ex) { scope.Failed(ex); throw; } finally { scope.Dispose(); } }