ユーザーが大きな画像 (最大約 100 MB) を Windows Azure Blob Storage サービスにアップロードできるようにする必要があるアプリケーションを構築しています。Windows Azure のファイル アップロードの最適化に関するRob Gillen の優れた記事を読み、 Parallel.Forループ内でCloudBlockBlob.PutBlock()メソッドを使用して、ファイル チャンクの並列アップロードを行うための彼のアプローチを借りました(コードはこちらから入手できます)。
私が抱えている問題は、ファイルをアップロードしようとするたびに、ストレージ クライアントから " InvalidMd5 " 例外が発生することです。問題は開発用ストレージにあるのではないかと疑い、ライブの Azure ストレージ アカウントに対してもコードを実行しようとしましたが、同じエラーが発生しました。Fiddlerでトラフィックを見ると、「Content-MD5」ヘッダーが有効な MD5 ハッシュに設定されていることがわかります。エラーの説明には、「リクエストで指定された MD5 値が無効です。MD5 値は 128 ビットで Base64 エンコードされている必要があります。」とありますが、私の知る限り、Fiddler で送信されている値は有効です (例a91c588092cedbdb1b82c2d3786fd509 )。
ハッシュの計算に使用するコードは次のとおりです (Rob Gillen の厚意による)。
public static string GetMD5HashFromStream(byte[] data)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
そして、これは PutBlock() への実際の呼び出しです:
blob.PutBlock(transferDetails[j].BlockId, new MemoryStream(buff), blockHash, options);
私も次のようにハッシュを渡そうとしました:
Convert.ToBase64String(Encoding.UTF8.GetBytes(blockHash))
しかし、結果は同じでした-「InvalidMd5」エラー:(
base64 エンコード (例: YTkxYzU4ODA5MmNlZGJkYjFiODJjMmQzNzg2ZmQ1MDk= )を使用して PutBlock() に渡される MD5 ハッシュとそれを使用しない場合 (例: a91c588092cedbdb1b82c2d3786fd509 ) は、違いを生むようには見えません。
ロブのコードは明らかに彼のために働いていました.私の場合、何が問題を引き起こしているのか本当にわかりません. Rob のコードに加えた唯一の変更は、ParallelUpload() 拡張メソッドを変更して、ファイル名の代わりに Stream を取得し、アップロードするファイルのサイズに応じてブロック サイズを動的に決定することです。
この問題を解決する方法を知っている人がいたら、教えてください! 本当に感謝します!私はすでにこれに苦労して2日を失いました。