PutBlock错误:远程服务器返回错误:(400)将文件上载到Azure时出现错误请求

时间:2013-12-27 09:06:43

标签: azure

我面临远程服务器返回错误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();
        } 

不知道为什么这个错误正在抛出并寻找可能的解决方案。

由于

2 个答案:

答案 0 :(得分:5)

我注意到的一件事是您使用整数值作为blockId。这可能是您上传失败的一个原因,因为所有blockIds的长度必须相同。因此,如果将文件拆分为10个块(blockId = 0 - 9),则上传代码将起作用。但是,如果文件被拆分为10个以上的块,则上传将失败。

我的建议是用0填充字符串,以便所有的blockIds都具有相同的长度。因为你可以将blob拆分为最多50,000个块,而blockId.ToString(&#34; d6&#34;)应该可以解决问题。

您可能还会发现此博文有用:http://gauravmantri.com/2013/05/18/windows-azure-blob-storage-dealing-with-the-specified-blob-or-block-content-is-invalid-error/

答案 1 :(得分:0)

我也面临着这个问题。我给AzCopy命令提供了一些不正确的参数,就是这样 - 我发出的每个新的AzCopy都开始给出令人沮丧的错误。在互联网上查了一堆东西,包括Gaurav Mantri的博客文章。他谈到'提交'未提交的块。

我发现从容器中“清除”每个该死的块的一种简单方法是使用名为“Azure Storage Explorer”的工具。它似乎显示所有块 - 只是选择它们并将它们全部核对。发布此删除我的AzCopy和平地工作!

(请注意,这些无效或未提交的块不会显示在azure管理门户上 - 想知道为什么azure团队不直接支持。这是一个非常PITA: - /