使用@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




