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

删除容器子文件夹内最新Blob时触发InvalidUri异常求助

删除Azure Blob存储中指定文件夹下最新Blob时触发InvalidUri异常

我需要列出foo/bar/子文件夹下的Blob,找到最新的一个并删除,但执行代码时触发了InvalidUri异常,错误提示"The requested URI does not represent any resource on the server."

原代码

private void deleteLatestBlob(String sasUrl, String container)
{
    BlobServiceClient serviceClient = new BlobServiceClientBuilder().endpoint(sasUrl).buildClient();
    BlobContainerClient containerClient = serviceClient.getBlobContainerClient(container);
    List<BlobClient> clients = containerClient.listBlobsByHierarchy("foo/bar/")
        .stream()
        .map(item -> containerClient.getBlobClient(item.getName()))
        .sorted((client1, client2) ->
            client2.getProperties().getLastModified()
                .compareTo(client1.getProperties().getLastModified()))
        .collect(Collectors.toList());

    if (!clients.isEmpty())
    {
        clients.get(clients.size() - 1).delete(); // Exception happens here
    }
}

异常信息

com.azure.storage.blob.models.BlobStorageException: Status code 400, "

return (<Error><Code>InvalidUri</Code><Message>The requested URI does not represent any resource on the server.
RequestId:300025de-001e-006e-7644-bfb34b000000
Time:2023-07-25T22:09:35.6134376Z</Message></Error>)
"
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
... snip...
at com.azure.storage.blob.specialized.BlobClientBase.delete(BlobClientBase.java:944)

问题根源

  1. 虚拟文件夹被误当作Blob处理:listBlobsByHierarchy("foo/bar/")会返回foo/bar/这个虚拟文件夹本身(可通过BlobItem.isPrefix()判断),它并不是实际存在的Blob资源,尝试删除它就会触发InvalidUri错误。
  2. 排序后取值逻辑错误:当前代码按最后修改时间降序排序,clients.get(clients.size()-1)取的是列表中最旧的Blob,和需求完全相反。

修正后的代码

private void deleteLatestBlob(String sasUrl, String containerName) {
    BlobServiceClient serviceClient = new BlobServiceClientBuilder().endpoint(sasUrl).buildClient();
    BlobContainerClient containerClient = serviceClient.getBlobContainerClient(containerName);

    // 过滤虚拟文件夹,只保留实际Blob,找到最新的那个并删除
    containerClient.listBlobsByHierarchy("foo/bar/")
        .stream()
        // 排除虚拟文件夹条目
        .filter(item -> !item.isPrefix())
        // 转换为BlobClient
        .map(item -> containerClient.getBlobClient(item.getName()))
        // 按最后修改时间降序排序,取第一个(最新的)
        .max(Comparator.comparing(client -> client.getProperties().getLastModified()))
        // 如果存在则执行删除
        .ifPresent(BlobClient::delete);
}

关键优化点

  • 过滤虚拟文件夹:通过filter(item -> !item.isPrefix())排除非实际Blob的虚拟文件夹条目。
  • 直接获取最新Blob:使用max()替代排序后收集全量列表,避免不必要的内存消耗,逻辑更简洁。
  • 修正取值逻辑:max()返回的就是最后修改时间最晚的Blob,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:27:41