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
相关产品推荐
相关产品推荐

