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

Azure PageBlob上传文件报x-ms-blob-content-length错误该如何解决?

问题原因与修复方案

1. 对齐逻辑错误(直接导致x-ms-blob-content-length报错)

你当前的文件大小对齐逻辑完全错误:

  • size % 512 得到的是当前文件大小超出上一个512字节边界的长度,要对齐到下一个512字节边界,需要补充的字节数为512 - (size % 512)(如果size%512 != 0的话)
  • ljust方法的第一个参数是补全后的总长度,不是需要补充的长度,你当前的写法根本无法把文件对齐到512字节的整数倍,这就是报错里3991344被判定为无效值的原因,该数值不是512的整数倍。

正确的对齐计算方式:

original_size = os.stat(file_path).st_size
# 向上取整对齐到512字节边界
aligned_size = ((original_size + 511) // 512) * 512

2. 请求头配置错误

你把Content-Length设为0,却同时在请求中传入了文件内容,导致请求头声明的长度和实际请求体长度不匹配,不符合HTTP规范。

3. 接口调用逻辑错误

Azure存储的Put Blob接口用于创建PageBlob时,请求体必须为空,仅用来声明PageBlob的总大小,所有数据写入需要调用Put Page接口完成,你把文件内容直接放在创建PageBlob的请求中不符合接口要求。


修正后完整代码

import os
import http.client
from urllib.parse import urlparse

sas_uri = '<SAS URI here>'
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_content = reader.read()

# 对齐文件大小到512字节边界
original_size = len(file_content)
aligned_size = ((original_size + 511) // 512) * 512
file_content = file_content.ljust(aligned_size, b'\x00')

# 第一步:创建空的PageBlob
create_headers = {
    'Content-Type': 'application/octet-stream',
    'Content-Length': '0',
    'x-ms-blob-type': 'PageBlob',
    'x-ms-blob-content-length': str(aligned_size)
}
conn.request('PUT', uri.path + uri.query, '', create_headers)
res = conn.getresponse()
res.read() # 消费响应体才能发起下一个请求
if res.status not in (200, 201):
    print(f"创建PageBlob失败,状态码:{res.status},错误信息:{res.read().decode()}")
    exit()

# 第二步:上传文件内容到PageBlob
upload_headers = {
    'Content-Type': 'application/octet-stream',
    'Content-Length': str(aligned_size),
    'x-ms-page-write': 'update',
    'x-ms-range': f'bytes=0-{aligned_size - 1}'
}
# 上传接口需要加comp=page参数
upload_path = f"{uri.path}?{uri.query}&comp=page"
conn.request('PUT', upload_path, file_content, upload_headers)
res = conn.getresponse()
print(res.read().decode("utf-8"))
conn.close()

内容的提问来源于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:30:01