我在我的网站上传了一个视频,客户使用简单的上传器上传视频,然后使用azure blob
上传到代码隐藏中的blob.UploadByteArray()
,
我想跟踪upload progress
当时上传了多少字节?是否有任何API或解决方法?
我不想使用第三方up-loader或blob pusher等。
答案 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);
}