【问题标题】:Track the upload progress while uploading file to azure blob在将文件上传到 azure blob 时跟踪上传进度
【发布时间】:2012-04-15 19:08:46
【问题描述】:

我正在通过客户端使用简单的上传器将视频上传到我的网站上,然后使用 blob.UploadByteArray() 在代码隐藏中上传到 azure blob,

我想跟踪upload progress,当时总共上传了多少字节?是否有任何 API 或解决方法?

我不想使用第三方上传器或 blob 推送器等。

【问题讨论】:

    标签: c# asp.net file-upload video-streaming azure-blob-storage


    【解决方案1】:

    我阅读了 CorneM 提到的那篇博文,但我对实施并不太热衷..

    相反,我对 FileStream 进行了子类化,以便它经常引发事件以便从中读取,并将我的子类文件流提供给 SDK 中天蓝色存储客户端上的 UploadFromStream 方法。更清洁,恕我直言

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

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

    【讨论】:

    • 这不准确,您只是跟踪将文件读入内存而不是将其上传到 Azure,这需要更长的时间。我自己也在寻找解决方案,我认为准确的方法应该是在块级左右。
    【解决方案2】:

    我还没有找到用于跟踪进度的 API。我实现进度条的一种方法是将 blob 作为较小的块上传到天蓝色存储。随着每个区块成功上传,您可以根据区块的数量来改变进度条。

    【讨论】:

      【解决方案3】:

      Azure 存储允许您将块上传到 blob。看看this example on MSDN blogs。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-03
        • 2017-09-12
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2017-03-14
        • 1970-01-01
        • 2016-03-09
        相关资源
        最近更新 更多