使用PageBlobClient上传Azure PageBlob遇认证及HTTP头错误如何解决
问题解决思路
我们逐个拆解两个错误的根因,对应给出修复方案:
一、403认证错误根因及修复
- 你生成的容器SAS权限仅为只读:从SAS参数
sp=r可以看出,生成SAS时只勾选了读取(r)权限,写入操作需要在生成SAS时额外勾选写入(w)权限,权限参数应为sp=rw。 - PageBlobClient需要传入指向具体页Blob的URI,你之前直接传入容器级SAS URI属于用法错误,需要在容器SAS URI后拼接你要操作的Blob名称,比如
https://storageaccountname.blob.core.windows.net/containername/blobname?[你的SAS参数]。
二、400参数错误根因及修复
页Blob有严格的写入规则限制:
- 写入的内容长度、起始偏移量必须是512字节的整数倍,你当前写入的"hello world"仅11字节,长度不符合要求,所以触发x-ms-range头校验失败。
- 写入数据前必须先调用
Create方法创建指定大小的页Blob,页Blob的总大小也必须是512字节的整数倍,不能直接调用UploadPages写入数据。
三、可选优化方案
如果你只是需要存储普通字符串,没有随机读写的强需求,建议直接使用块Blob,无需遵循512字节对齐规则,使用更简单:
块Blob修正代码示例
// 注意SAS生成时要勾选写入权限,URI后拼接你要创建的块Blob名称 var sasUriStr = "https://storageaccountname.blob.core.windows.net/containername/yourblobname?sp=rw&st=2021-08-10T00:34:00Z&se=2021-08-15T08:34:00Z&spr=https&sv=2020-08-04&sr=c&sig=ABCDEFGH/YJKLMNOP="; var uri = new Uri(sasUriStr); var blockBlobClient = new BlockBlobClient(uri); // 块Blob直接上传即可,无需对齐要求 blockBlobClient.Upload(new MemoryStream(Encoding.UTF8.GetBytes("hello world")), overwrite: true);
必须使用页Blob的修正代码示例
var sasUriStr = "https://storageaccountname.blob.core.windows.net/containername/yourpageblobname?sp=rw&st=2021-08-10T00:34:00Z&se=2021-08-15T08:34:00Z&spr=https&sv=2020-08-04&sr=c&sig=ABCDEFGH/YJKLMNOP="; var uri = new Uri(sasUriStr); var pageBlobClient = new PageBlobClient(uri); // 先创建1KB大小的页Blob(1024是512的整数倍) pageBlobClient.Create(1024); // 构造512字节的写入内容,不足部分补0 var content = Encoding.UTF8.GetBytes("hello world"); var alignedContent = new byte[512]; Array.Copy(content, alignedContent, content.Length); // 偏移量0对齐512,写入512字节内容 pageBlobClient.UploadPages(new MemoryStream(alignedContent), 0);
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

