我正在尝试将内容上传到azure blob,大小超过32MB。下面的c#代码段:
CloudBlockBlob blob = _blobContainer.GetBlockBlobReference(blobName);
blob.UploadFromByteArray(contents, 0, contents.Length, AccessCondition.GenerateIfNotExistsCondition(), options:writeOptions);
每次blob超过32MB时,上面都会引发异常:
Exception thrown: 'Microsoft.WindowsAzure.Storage.StorageException' in Microsoft.WindowsAzure.Storage.dll
Additional information: The remote server returned an error: (404) Not Found.
根据this
当块blob上传大于此属性中的值时, 存储客户端将文件分成块。
是否应该有单独的代码行来启用此功能。
答案 0 :(得分:2)
存储客户端默认为最大单个块上传32 MB。当块blob上传大于
SingleBlobUploadThresholdInBytes
属性中的值时,存储客户端会将文件分成块。
正如Tamra所说,存储客户端处理将文件分成块的工作。以下是我对你的测试,以便更好地理解它。
代码示例
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
var writeOptions = new BlobRequestOptions()
{
SingleBlobUploadThresholdInBytes = 50 * 1024 * 1024, //maximum for 64MB,32MB by default
};
blob.UploadFromByteArray(contents, 0, contents.Length, AccessCondition.GenerateIfNotExistsCondition(), options: writeOptions);
<强>方案强>
如果您正在编写一个大小不超过SingleBlobUploadThresholdInBytes
属性的块blob,您可以通过一次写操作完整地上传它。
您可以通过在调用UploadFromByteArray
方法时通过Fiddler捕获网络包来理解它。
当块blob上传大于SingleBlobUploadThresholdInBytes
属性中的值时,存储客户端会自动将文件分成块。
我上传了一个大小接近90MB的blob,然后你可以找到差异如下:
根据快照,您可以发现存储客户端将文件分成4MB大小的块并同时上传块。
每次blob超过32MB时,上面都会引发异常
您可以尝试设置SingleBlobUploadThresholdInBytes
属性或在调用UploadFromByteArray
方法时捕获网络包以查找详细错误。