【问题标题】:Upload video in chunks Azure blob storage分块上传视频 Azure blob 存储
【发布时间】:2020-08-12 08:33:00
【问题描述】:

我正在分块接收文件内容。正如我所读到的,推荐使用 Azure blob 存储的最新 nuget 是 Azure.Storage.Blobs,但我找不到任何示例或方法如何分块上传文件?支持吗?

我收到的范围是Range 标头。我正在使用这个quickstart

【问题讨论】:

  • 您是否尝试过使用 AppendBlob?

标签: c# azure asp.net-core


【解决方案1】:

您想要使用的方法是 BlockBlobClient.StageBlock 上传块数据和 BlockBlobClient.CommitBlock 提交块并创建块 blob。

这是一个非常糟糕的功能实现:)。它基本上是从本地计算机读取一个非常大的文件,然后通过将文件分成 1MB 块来上传。

    static void UploadBlobsInChunks()
    {
        var containerClient = new BlobContainerClient(connectionString, "test");
        containerClient.CreateIfNotExists();
        var filePath = @"C:\temp\mymovie.mp4";

        var blockBlobClient = containerClient.GetBlockBlobClient("mymovie.mp4");
        int blockSize = 1 * 1024 * 1024;//1 MB Block
        int offset = 0;
        int counter = 0;
        List<string> blockIds = new List<string>();

        using (var fs = File.OpenRead(filePath))
        {
            var bytesRemaining = fs.Length;
            do
            {
                var dataToRead = Math.Min(bytesRemaining, blockSize);
                byte[] data = new byte[dataToRead];
                var dataRead = fs.Read(data, offset, (int) dataToRead);
                bytesRemaining -= dataRead;
                if (dataRead > 0)
                {
                    var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(counter.ToString("d6")));
                    blockBlobClient.StageBlock(blockId, new MemoryStream(data));
                    Console.WriteLine(string.Format("Block {0} uploaded successfully.", counter.ToString("d6")));
                    blockIds.Add(blockId);
                    counter++;
                }
            }
            while (bytesRemaining > 0);
            Console.WriteLine("All blocks uploaded. Now committing block list.");
            var headers = new BlobHttpHeaders()
            {
                ContentType = "video/mp4"
            };
            blockBlobClient.CommitBlockList(blockIds, headers);
            Console.WriteLine("Blob uploaded successfully!");
        }
    }

【讨论】:

  • 很好,但是如果我想稍后替换文件的第一个块怎么办?有可能吗?
  • 是的,当然可以更换积木。但是,IIRC 在 SDK 中存在替换块的错误(请在 Github 存储库中搜索此问题),因此请确保您在替换块时没有遇到该错误。
  • 非常感谢。如何将文件上传到特定路径。喜欢 - (ContainerName/folder1/folder2/file.jpg)
  • @MohammedAshrafali 只需将此处的路径 var blockBlobClient = containerClient.GetBlockBlobClient("mymovie.mp4") 替换为您的路径即可。例如。 var blockBlobClient = containerClient.GetBlockBlobClient("folder1/folder2/file.jpg")
猜你喜欢
  • 2020-04-09
  • 2020-11-07
  • 2013-11-08
  • 1970-01-01
  • 2014-08-16
  • 2015-11-30
  • 2015-05-20
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多