gpt4 book ai didi

c# - Azure 存储计算的 MD5 与现有属性不匹配

转载 作者:可可西里 更新时间:2023-11-01 09:11:52 32 4
gpt4 key购买 nike

我正在尝试通过 ashx 传递 Azure 存储 blob。在 blockBlob.DownloadToStream(memoryStream) 上,它抛出以下异常:Microsoft.WindowsAzure.Storage.StorageException:计算的 MD5 与现有属性不匹配

我知道它正在找到正确的 Blob 。如果我放入不存在的容器和路径,则会出现 404 异常。

我在 Google 上搜索了可能导致此错误的原因的提示,但没有找到任何有用的信息。有人对可能造成这种情况的原因有任何想法吗?在过去的几天里,我用几种不同的方式重写了这段代码,但它总是在 DownloadToStream 上死掉。

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

public void ProcessRequest(HttpContext context) {
// Retrieve storage account from connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("gmt");

// Retrieve reference to blob named "articles/142/222.jpg".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("articles/142/222.jpg");

using (var memoryStream = new MemoryStream()) {
blockBlob.DownloadToStream(memoryStream);
byte[] photoByte = ReadFully(memoryStream);
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
context.Response.OutputStream.Write(photoByte, 0, photoByte.Length);
}
}

public static byte[] ReadFully(Stream input) {
input.Position = 0;
using (MemoryStream ms = new MemoryStream()) {
input.CopyTo(ms);
return ms.ToArray();
}
}

最佳答案

我能够重现您面临的问题。如果 blob 的 Content MD5 属性因某种原因损坏,就会发生这种情况。我有一个包含一些 MD5 内容的 blob(这是正确的)。然后我以编程方式将 MD5 更改为其他值(这是不正确的)。现在,当我在 blob 上调用 DownloadToStream() 方法时,我收到完全相同的错误。

您可以通过将 BlobRequestOptions 中的 DisableContentMD5Validation 设置为 true 来绕过此检查,如以下代码所示:

            BlobRequestOptions options = new BlobRequestOptions()
{
DisableContentMD5Validation = true,
};
blockBlob.DownloadToStream(memoryStream, null, options);

尝试一下,应该会起作用。

顺便说一句,您可能还想修改您的 ReadFully 方法。您需要将输入流指针移至开头。

    public static byte[] ReadFully(Stream input)
{
input.Position = 0;//Positioning it to the top of stream.
using (MemoryStream ms = new MemoryStream())
{
input.CopyTo(ms);
return ms.ToArray();
}
}

关于c# - Azure 存储计算的 MD5 与现有属性不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20546343/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com