You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用@azure/storage-blob上传至Azure Blob后出现请求失败错误求助

解决Azure Blob上传后出现的RestError及无效URL问题

嘿,我看你用@azure/storage-blob上传文件到Azure Blob时,遇到了上传成功后5-10秒才出现的异常请求错误——这俩错误的核心都是URL格式异常:一个是请求无法发送,另一个直接缺失了存储账户域名(变成https:///Files/...)。咱们一步步来定位解决:

1. 先修复容器检查的异步逻辑(最可能的根源)

你代码里直接调用containerClient.exists()是踩了异步的坑!这个方法返回的是Promise<boolean>,不是同步值——你不等它返回结果就执行create(),会导致容器创建逻辑混乱,甚至后续生成的Blob客户端URL直接出错。

把代码改成这样,用RxJS的操作符处理异步流:

public uploadFilesToAzureBlob(sasToken: string, file: any, id: string): Observable<any> { 
  const blobServiceClient = new BlobServiceClient(sasToken); 
  const containerClient = blobServiceClient.getContainerClient(id); 

  // 先检查容器是否存在,异步等待结果
  return from(containerClient.exists()).pipe(
    switchMap((containerExists) => {
      // 不存在才创建容器,同样等待创建完成
      if (!containerExists) {
        return from(containerClient.create());
      }
      return of(null); // 容器已存在,直接跳过
    }),
    // 容器准备好后,再执行上传逻辑
    switchMap(() => {
      const blockBlobClient = containerClient.getBlockBlobClient(file.name); 
      return from(blockBlobClient.uploadBrowserData(file, { 
        blockSize: 10485760, 
        concurrency: 20, 
        blobHTTPHeaders: { blobContentType: file.type } 
      }));
    }),
    map((response: any) => response), 
    catchError(this.handleError)
  ); 
}

2. 检查SAS Token的版本和格式

你错误里的SAS用的是sv=2017-04-17,这是非常老旧的存储服务版本,可能存在兼容性问题。建议升级到较新的版本(比如sv=2022-11-02),同时确保:

  • SAS Token是完整的(要么是带存储账户URL的完整地址,要么是纯Token部分,初始化BlobServiceClient时要拼接正确)
  • SAS的权限参数sp要包含r(读权限)——因为错误里出现了GET请求,可能是上传后客户端自动做校验,需要读权限

3. 排查上传后额外触发的GET请求

上传成功后延迟出现错误,大概率是某个逻辑自动发起了对Blob URL的请求。你可以:

  • 打开浏览器开发者工具的Network面板,找到那个异常GET请求,查看它的发起源(比如是你的代码、Angular的Zone还是第三方插件)
  • 如果是不必要的请求,直接通过代码逻辑或拦截器阻止它

4. 确认BlobServiceClient初始化正确

确保传入的sasToken格式正确:

  • 如果是完整的SAS URL(包含存储账户地址),直接传给BlobServiceClient即可
  • 如果只是纯Token字符串,要拼接成完整地址:
const storageAccountUrl = "https://your-storage-account.blob.core.windows.net";
const blobServiceClient = new BlobServiceClient(`${storageAccountUrl}/?${sasToken}`);

内容的提问来源于stack exchange,提问作者Hiren Patel

火山引擎 最新活动