You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:42:01