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

如何在Swift中使用Amplify从AWS S3仅列出指定文件?

解决AWS Amplify Storage列出指定路径内容并批量删除的问题

1. 修改ListModel函数,支持指定路径筛选并返回结果

原ListModel函数没有参数,无法指定路径,且没有返回结果的机制。我们可以通过添加路径前缀参数和异步闭包回调来实现需求:

func listModel(withPrefix prefix: String, completion: @escaping (Result<[StorageItem], StorageError>) -> Void) {
    // 设置List请求的前缀参数,只列出该路径下的内容
    let listOptions = StorageListRequest.Options(prefix: prefix)
    Amplify.Storage.list(options: listOptions) { event in
        switch event {
        case let .success(listResult):
            // 将筛选后的文件列表通过闭包返回
            completion(.success(listResult.items))
        case let .failure(storageError):
            completion(.failure(storageError))
        }
    }
}

调用示例

当用户选中某个项目后,传入其关联的S3路径前缀即可获取对应内容:

// 假设选中项目的关联路径是"user/456/attachments/"
listModel(withPrefix: "user/456/attachments/") { result in
    switch result {
    case let .success(items):
        // 拿到指定路径下的所有文件key,执行批量删除
        self.batchDeleteImages(with: items.map { $0.key })
    case let .failure(error):
        print("获取指定路径内容失败:\(error.errorDescription). \(error.recoverySuggestion)")
    }
}

2. 实现批量删除逻辑

基于你已有的deleteImage函数,我们可以通过循环调用完成批量删除;如果需要监听所有删除操作的完成状态,推荐使用DispatchGroup:

方式1:基础循环调用

直接复用原deleteImage函数:

func batchDeleteImages(with keys: [String]) {
    keys.forEach { key in
        deleteImage(key: key)
    }
}

方式2:带完成通知的批量删除(推荐)

用DispatchGroup追踪所有删除操作,完成后执行后续逻辑(比如刷新UI):

func batchDeleteImages(with keys: [String]) {
    let deleteGroup = DispatchGroup()
    
    keys.forEach { key in
        deleteGroup.enter()
        Amplify.Storage.remove(key: key) { event in
            defer { deleteGroup.leave() }
            switch event {
            case let .success(deletedKey):
                print("已删除文件:\(deletedKey)")
            case let .failure(error):
                print("删除文件失败:\(error.errorDescription). \(error.recoverySuggestion)")
            }
        }
    }
    
    // 所有删除操作完成后触发
    deleteGroup.notify(queue: .main) {
        print("全部文件删除完成")
        // 这里可以添加UI刷新、提示用户等逻辑
    }
}

3. 可选:优化deleteImage函数

如果需要在单个文件删除时通知调用方,可以给函数添加可选的闭包回调:

func deleteImage(key: String, completion: ((Result<String, StorageError>) -> Void)? = nil) {
    Amplify.Storage.remove(key: key) { event in
        switch event {
        case let .success(deletedKey):
            print("已删除文件:\(deletedKey)")
            completion?(.success(deletedKey))
        case let .failure(error):
            print("删除文件失败:\(error.errorDescription). \(error.recoverySuggestion)")
            completion?(.failure(error))
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:01:18