我有一个大众上传系统,我想做以下事情:
但是从API返回的块的顺序不是文档所说的顺序。
根据Azure存储API网站,
从最近上传的块开始,返回未提交的块列表,返回到最早上传的块。 (https://msdn.microsoft.com/en-us/library/azure/dd179400.aspx,在底部的备注部分)
但是,原始API调用以及Microsoft Azure存储SDK都按字母顺序返回块,而不是按照以任何方式上载的顺序。
我读错了文档吗?这可能是API中的错误吗?本地存储模拟器也提供相同的结果。
谢谢!
答案 0 :(得分:4)
我们检查了存储服务方面的问题,这是交易:文档有一个错误。从第1天开始,已按字母顺序返回未提交块的列表。我们会尽快更新MSDN文档以消除错误,对于给您带来的任何不便,我们深表歉意!
以下是解决问题的一些想法:
探索其他一些blob类型。
如果您想按照上传的顺序写入数据,那么追加blob可能会更好。附加blob具有与块blob相同的读取行为和吞吐量,但不允许您更新或删除已放置的块。但是,要附加数据,您需要做的就是appendBlock,这将添加到blob的末尾 - 无需提交!
页面blob还允许您在不提交的情况下放置数据。与附加blob不同,它们将允许在blob中间进行修改。但是,他们对数据长度的严格限制可被512整除。因此,如果这不是数据的自然属性,则需要处理填充。
SDK对append和page有很好的分块支持,你只需要输入数据就可以了。当然还有块,但是状态仍然是客户端。
答案 1 :(得分:0)
您可以为每次调用blob.PutBlock传递增量blockId(或chunkId):
var blockCount = 0;
...
var blockId = Convert.ToBase64String(BitConverter.GetBytes(blockCount));
blob.PutBlock(blockId, ms, null);
blocksCount++;
然后通过知道传输的块的数量提交它们:
var blockIds = Enumerable.Range(0, blocksCount).Select(b => Convert.ToBase64String(BitConverter.GetBytes(b)));
blob.PutBlockList(blockIds);