我面临远程服务器返回错误400的问题,将文件作为块blob上传到Azure时出现错误请求。但奇怪的是,有时候代码可以用于上传特定文件,有时候它会因同一个文件而失败。
我的代码就像 -
List<string> blockIdList = new List<string>();
using (var file = new FileStream(_path, FileMode.Open, FileAccess.Read))
{
int blockId = 0;
int blockSize = 4096;
// open file
while (file.Position < file.Length)
{
// calculate buffer size (blockSize in KB)
long bufferSize = blockSize * 1024 < file.Length - file.Position ? blockSize * 1024 : file.Length - file.Position;
byte[] buffer = new byte[bufferSize];
// read data to buffer
file.Read(buffer, 0, buffer.Length);
// save data to memory stream and put to storage
using (var stream = new MemoryStream(buffer))
{
// set stream position to start
stream.Position = 0;
convert block id to Base64 Encoded string
var blockIdBase64 = Convert.ToBase64String(System.BitConverter.GetBytes(blockId));
blockBlob.PutBlock(blockIdBase64, stream, null);
blockIdList.Add(blockIdBase64);
// increase block id
blockId++;
}
}
blockBlob.PutBlockList(blockIdList);
file.Close();
}
不知道为什么这个错误正在抛出并寻找可能的解决方案。
由于
答案 0 :(得分:5)
我注意到的一件事是您使用整数值作为blockId
。这可能是您上传失败的一个原因,因为所有blockIds的长度必须相同。因此,如果将文件拆分为10个块(blockId = 0 - 9),则上传代码将起作用。但是,如果文件被拆分为10个以上的块,则上传将失败。
我的建议是用0填充字符串,以便所有的blockIds都具有相同的长度。因为你可以将blob拆分为最多50,000个块,而blockId.ToString(&#34; d6&#34;)应该可以解决问题。
答案 1 :(得分:0)
我也面临着这个问题。我给AzCopy命令提供了一些不正确的参数,就是这样 - 我发出的每个新的AzCopy都开始给出令人沮丧的错误。在互联网上查了一堆东西,包括Gaurav Mantri的博客文章。他谈到'提交'未提交的块。
我发现从容器中“清除”每个该死的块的一种简单方法是使用名为“Azure Storage Explorer”的工具。它似乎显示所有块 - 只是选择它们并将它们全部核对。发布此删除我的AzCopy和平地工作!
(请注意,这些无效或未提交的块不会显示在azure管理门户上 - 想知道为什么azure团队不直接支持。这是一个非常PITA: - /