using Microsoft.WindowsAzure.Storage.Blob; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.IO; namespace Tango.Transport.Web { public class StorageBlobUploader : IDisposable { private bool _disposed; private FileStreamWrapper _stream; public CloudBlockBlob Blob { get; private set; } public event EventHandler Progress; public StorageBlobUploader(CloudBlockBlob blob, String fileName) { Blob = blob; _stream = new FileStreamWrapper(fileName, FileMode.Open, OnProgress); } public StorageBlobUploader(String blobAddress, String fileName) : this(new CloudBlockBlob(new Uri(blobAddress)), fileName) { } private void OnProgress(long current) { Progress?.Invoke(this, new WebFileDownloaderProgressEventArgs() { Current = current, Total = _stream.Length, }); } public async Task Upload() { if (_disposed) { throw new ObjectDisposedException("The storage blob uploader can only be used once."); } await Blob.UploadFromStreamAsync(_stream); Dispose(); } public void Dispose() { if (!_disposed) { _disposed = true; _stream.Dispose(); } } } }