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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:04:59