在将文件上载到azure blob时跟踪上载进度

本文关键字:上载 跟踪 blob azure 文件 | 更新日期: 2023-09-27 18:29:38

我正在我的网站上上传一段视频,由客户端使用简单的上传器拍摄,然后使用blob.UploadByteArray()、在代码背后上传到azure blob

我想跟踪upload progress,那一刻总共上传了多少字节?有没有API或解决方法?

我不想使用第三方上加载器或blob pusher等。

在将文件上载到azure blob时跟踪上载进度

我读过CorneM提到的那篇博客文章,但我对实现并不太感兴趣。。

相反,我对FileStream进行了子类化,以便它每隔读取一次就会引发事件,并在SDK中将我的子类化文件流提供给azure存储客户端上的UploadFromStream方法。更清洁,IMHO

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存储容器,file是我本地文件的FileInfo):

        CloudBlockBlob blockBlob = _container.GetBlockBlobReference(blobPath);
        using (ProgressTrackingFileStream ptfs = new ProgressTrackingFileStream(file.FullName, FileMode.Open))
        {
            ptfs.StreamPositionUpdated += ptfs_StreamPositionUpdated;
            blockBlob.UploadFromStream(ptfs);
        }

我还没有找到跟踪进度的API。我实现进度条的一种方法是将blob作为较小的块上传到azure存储中。当每个区块成功上传时,您可以根据区块的数量在进度条中进行更改。

Azure存储允许您将块上传到blob。看看MSDN博客上的这个例子。

通过向Azure发送数据块,您可以同时跟踪进度。