Azure下载Blob部分

6
我将非常感激有任何使用DownloadRangeToStream函数的经验的人。在这里,它们说参数“length”是数据的长度,但从我的经验来看,它是要下载的段的上限位置,例如,“length”-“offset”=数据的实际长度。
我也很想得到一些以块方式下载Blob的代码,因为之前提到的函数似乎无法正常工作。
谢谢您的帮助。
1个回答

13

尝试使用这段代码。它通过将大块数据拆分为1 MB的小块来下载。

    static void DownloadRangeExample()
    {
        var cloudStorageAccount = CloudStorageAccount.DevelopmentStorageAccount;
        var containerName = "container";
        var blobName = "myfile.zip";
        int segmentSize = 1 * 1024 * 1024;//1 MB chunk
        var blobContainer = cloudStorageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
        var blob = blobContainer.GetBlockBlobReference(blobName);
        blob.FetchAttributes();
        var blobLengthRemaining = blob.Properties.Length;
        long startPosition = 0;
        string saveFileName = @"D:\myfile.zip";
        do
        {
            long blockSize = Math.Min(segmentSize, blobLengthRemaining);
            byte[] blobContents = new byte[blockSize];
            using (MemoryStream ms = new MemoryStream())
            {
                blob.DownloadRangeToStream(ms, startPosition, blockSize);
                ms.Position = 0;
                ms.Read(blobContents, 0, blobContents.Length);
                using (FileStream fs = new FileStream(saveFileName, FileMode.OpenOrCreate))
                {
                    fs.Position = startPosition;
                    fs.Write(blobContents, 0, blobContents.Length);
                }
            }
            startPosition += blockSize;
            blobLengthRemaining -= blockSize;
        }
        while (blobLengthRemaining > 0);
    }

@Guarav Mantri... 在using语句中,内存流会被处理掉,那么如何分段下载大文件并返回整个内存流呢?我尝试删除using语句并添加ms.Writeasync(blobContents),但当我返回它时,ms仍然为空。 - dinotom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接