【问题标题】:Upload Vhd to an Azure Page blob in chunks将 Vhd 分块上传到 Azure Page blob
【发布时间】:2023-06-05 15:23:02
【问题描述】:

我正在尝试将 Vhd(大小至少 30GB)上传到 mvc Web 应用程序中 Azure 存储中的页面 blob。由于文件的大小,我无法将这个大文件作为一个整体上传,因为浏览器不允许发送这个大请求。因此,唯一的选择是分块上传文件(即 4mb)。在客户端大小上,我能够进行分块,并且我通过 ajax 请求(在循环中)将块发送到我的服务器端控制器。但是使用 .net sdk for azure 我找不到将块上传到页面 blob 的方法。

PS 有一种方法可以使用 putblock() 和 putblocklist() 方法在块 blob 中以块的形式上传文件,我能够以这种方式实现上传,但我需要从上传的 vhd 中创建一个 VM 映像和为此,它需要是一个页面 blob。 因此,我欢迎任何指导向我展示使用 azure .net sdk 在 Page Blob 中以块的形式上传 vhd 的方法。

【问题讨论】:

    标签: azure file-upload azure-blob-storage


    【解决方案1】:

    您可以使用CloudPageBlob.WritePages 方法上传数据块。有关使用此方法的示例,请参阅 Azure 存储团队的这篇博文:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/11/using-windows-azure-page-blobs-and-how-to-efficiently-upload-and-download-page-blobs.aspx

    【讨论】:

    • 是的,我已经看到了......但是 writepages 方法是否会附加每个即将到来的块,通过 ajax 请求或它只是覆盖?
    • 它不会自动追加数据。除了您通过 AJAX 方法发送的字节数组之外,您还需要发送偏移量。然后,您发送的任何数据都将从目标页面 blob 中偏移量中指定的位置写入。
    • 并且使用这种方法必须将完整的文件 30GB 从 Js 控制器发送到服务器端。这导致了这个问题。如您所见,分块已在服务器端完成(即 4mb)
    • 不是真的......我不确定你是如何发送块的,但除了块之外,你需要从你读取块的位置发送文件中的起始位置(这就是偏移量)。
    • 好的,如果发送偏移量,那么我将不得不简单地将其分配给 'vhdOffset' 变量来解决问题?
    【解决方案2】:

    您无需编写任何代码即可尝试AzCopy tool

    AzCopy /Source:C:\myfolder /目的地:https://myaccount.blob.core.windows.net/mycontainer /DestKey:mykey /Pattern:abc.vhd /BlobType:Page

    【讨论】: