通过Azure Functions调用PUT Block上传大文件至Azure Blob遇格式错误
问题分析与解决
错误根源
报错"The value for one of the HTTP headers is not in the correct format"的核心原因是Block ID不符合Azure Blob存储的格式要求:
- Block ID必须是Base64编码字符串
- 解码后的原始字节长度不能超过64字节
- 不能包含换行符等无效字符
你的代码直接使用req.Form["blockId"].ToString()作为Block ID,大概率是未做Base64编码,或编码后格式不规范,导致请求头验证失败。
修正方案
1. 前端提前处理Block ID
前端生成分片ID时,需先做Base64编码,示例:
// 前端生成符合要求的Block ID const blockId = btoa(`block-${分片序号}`);
2. 后端代码修正
需确保Block ID有效,同时重置内存流的读取位置(CopyToAsync后流指针在末尾,需移至开头才能被正确读取):
try { var files = req.Form.Files; var file = files[0]; var blockId = req.Form["blockId"].ToString(); // 验证Block ID是否为有效Base64(可选但推荐) try { Convert.FromBase64String(blockId); } catch { return new BadRequestObjectResult("无效的blockId:必须是Base64编码格式"); } using (var ms = new MemoryStream()) { await file.CopyToAsync(ms); ms.Position = 0; // 重置流指针到起始位置 CloudBlobContainer blobContainer = new CloudBlobContainer( new Uri("https://myblob.blob.core.windows.net/coolstuff"), new StorageCredentials("mykey")); CloudBlockBlob blob = blobContainer.GetBlockBlobReference(file.FileName); await blob.PutBlockAsync(blockId, ms, null); } return new OkObjectResult("文件分片上传成功"); } catch (Exception ex) { log.LogError(ex, "上传文件分片时出错"); return new StatusCodeResult(StatusCodes.Status500InternalServerError); }
额外注意事项
- 所有分片的Block ID解码后长度必须一致,否则合并块时会报错
- 分片大小建议设置为4MB~100MB(Azure Blob单块最大支持100MB,小于4MB会自动合并为小块)
- 所有分片上传完成后,需调用
PutBlockListAsync将分片合并为完整Blob,否则单独的分片不会形成有效文件
内容的提问来源于stack exchange,提问作者Danish Naglekar
相关产品推荐
相关产品推荐

