Отслеживайте ход выполнения загрузки при загрузке файла в BLOB-объект Azure. - PullRequest
0 голосов
/ 02 апреля 2012

Я загружаю видео на свой сайт, забирая его клиентом с помощью простого загрузчика, затем загружая в azure blob в коде с помощью blob.UploadByteArray(),

Я хочу отслеживать upload progress, сколькобайты загружены из общего количества в тот момент?Есть ли API или обходной путь для этого?

Я не хочу использовать сторонний загрузчик, загрузчик больших двоичных объектов и т. Д.

Ответы [ 3 ]

0 голосов
/ 25 марта 2013

Хранилище Azure позволяет загружать блоки в большой двоичный объект. Взгляните на этот пример в блогах MSDN .

Отправляя блоки данных в Azure, вы можете отслеживать свои успехи.

0 голосов
/ 12 сентября 2013

Я прочитал этот пост в блоге, упомянутый CorneM, но я не слишком заинтересовался реализацией.

Вместо этого я поместил в подкласс FileStream так, что он вызывал события так часто, что его читали, и предоставил мойПреобразование потока файлов в метод UploadFromStream в клиенте хранилища Azure в SDK.Гораздо чище, ИМХО

public delegate void PositionChanged(long position);

public class ProgressTrackingFileStream: FileStream
{
    public int AnnounceEveryBytes { get; set; }
    private long _lastPosition = 0;


    public event PositionChanged StreamPositionUpdated;

    // implementing other methods that the storage client may call, like ReadByte or Begin/EndRead is left as an exercise for the reader

    public override int Read(byte[] buffer, int offset, int count)
    {
        int i = base.Read(buffer, offset, count);

        MaybeAnnounce();

        return i;
    }

    private void MaybeAnnounce()
    {
        if (StreamPositionUpdated != null && (base.Position - _lastPosition) > AnnounceEveryBytes)
        {
            _lastPosition = base.Position;
            StreamPositionUpdated(_lastPosition);
        }
    }

    public ProgressTrackingFileStream(string path, FileMode fileMode) : base(path, fileMode) 
    {
        AnnounceEveryBytes = 32768;
    }

}

А потом использовал его вот так (_container - это мой контейнер хранения Azure, файл - это FileInfo для моего локального файла):

        CloudBlockBlob blockBlob = _container.GetBlockBlobReference(blobPath);

        using (ProgressTrackingFileStream ptfs = new ProgressTrackingFileStream(file.FullName, FileMode.Open))
        {
            ptfs.StreamPositionUpdated += ptfs_StreamPositionUpdated;

            blockBlob.UploadFromStream(ptfs);
        }
0 голосов
/ 24 апреля 2012

Я не нашел API для отслеживания прогресса.Одним из способов реализации индикатора выполнения является загрузка большого двоичного объекта в виде небольших кусков в хранилище Azure.После успешной загрузки каждого чанка вы можете изменять его в зависимости от количества чанков.

...