删除容器子文件夹内最新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)
问题根源
- 虚拟文件夹被误当作Blob处理:
listBlobsByHierarchy("foo/bar/")会返回foo/bar/这个虚拟文件夹本身(可通过BlobItem.isPrefix()判断),它并不是实际存在的Blob资源,尝试删除它就会触发InvalidUri错误。 - 排序后取值逻辑错误:当前代码按最后修改时间降序排序,
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
相关产品推荐
相关产品推荐

