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

时间:2012-04-02 04:58:06

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

我在我的网站上传了一个视频,客户使用简单的上传器上传视频,然后使用azure blob上传到代码隐藏中的blob.UploadByteArray()

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

我不想使用第三方up-loader或blob pusher等。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

相反,我将FileStream子类化,以便它经常引发事件以便从中读取,并将我的子类文件流提供给SDK中azure存储客户端上的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是我的azure存储容器,file是我本地文件的FileInfo):

        CloudBlockBlob blockBlob = _container.GetBlockBlobReference(blobPath);

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

            blockBlob.UploadFromStream(ptfs);
        }