Azure PageBlob单块上传时报x-ms-range参数无效错误如何解决?
错误原因
- Azure 页 blob 要求
x-ms-range指定的写入区间必须是512字节对齐:区间起始偏移、区间总长度都必须是512的整数倍,区间结束偏移必须为512整数倍减1。 - 你当前的逻辑里预留存储的
block_size是对齐后的长度,但实际写入时用的file_size没有对齐,导致x-ms-range的结束值file_size-1不符合对齐要求,触发InvalidHeaderValue报错。
修复方案
修改上传部分的逻辑,补全文件内容到对齐长度,同时调整上传请求的头参数即可,修改后完整代码如下:
import os import http.client from urllib.parse import urlparse sas_uri = '<SAS URI>' uri = urlparse(sas_uri) conn = http.client.HTTPSConnection(uri.hostname, port=uri.port, timeout=3000) file_path = r"C:\Users\user\Downloads\npp.Installer.exe" with open(file_path, 'rb') as reader: file = reader.read() file_size = os.stat(file_path).st_size block_size = file_size boundary = block_size % 512 if boundary != 0: block_size = block_size + 512 - boundary # 对文件内容补零到对齐后的长度 file += b'\x00' * (block_size - file_size) # 预留块存储空间 headers = { 'Content-Type': 'application/octet-stream', 'Content-Length': 0, 'x-ms-blob-type': 'PageBlob', 'x-ms-blob-content-length': block_size } conn.request('PUT', sas_uri, '', headers) res = conn.getresponse() data = res.read() print(data.decode("utf-8")) # 上传文件 headers = { 'Content-Type': 'application/octet-stream', 'Content-Length': block_size, # 改为对齐后的长度 'x-ms-blob-type': 'PageBlob', 'x-ms-page-write': 'update', 'x-ms-range': f'bytes=0-{block_size-1}' # 用对齐后的长度计算range结束偏移 } conn.request('PUT', sas_uri + '&comp=page', file, headers) res = conn.getresponse() data = res.read() print(data.decode("utf-8"))
补充说明
页 blob 本身要求总大小必须为512字节的整数倍,如果你需要最终对外暴露的文件大小和原始文件一致,可以在上传完成后调用Set Blob Properties接口,将x-ms-blob-content-length设置为原始的file_size即可,多余的尾部零不会被返回给访问者。
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

