Swift调用S3接口删除Bucket文件返回成功但文件仍留存问题求助
1. 最核心错误:S3对象Key带开头斜杠
S3的对象Key是基于Bucket根目录的相对路径,不允许开头带斜杠。你当前代码中删除逻辑的Key写为/images/xxx,开头的斜杠会导致你实际请求删除的是一个不存在的对象。而S3服务对删除不存在对象的请求默认返回204成功状态,所以你会收到删除成功的回调但实际文件没有变动。
修正方法:把deleteObjectRequest.key的赋值改为去掉开头斜杠的格式:
// 错误写法 // deleteObjectRequest.key = "/images/\(s3Key.components(separatedBy: "/").last ?? "")" // 正确写法 deleteObjectRequest.key = "images/\(s3Key.components(separatedBy: "/").last ?? "")"
2. 禁止传入完整URL作为Key
你测试时传入完整URL作为Key的用法是完全错误的,Key仅需填写Bucket根目录到文件的相对路径,不需要包含域名、Bucket名称、区域等信息。
如果调用删除方法时传入的s3Key参数是完整的文件URL,需要先提取URL中路径部分,并去掉开头斜杠和Bucket名称前缀:比如旧文件URL是https://s3.us-east-1.amazonaws.com/bucketNumber/images/old_img.png,提取后的正确Key为images/old_img.png。
3. 检查Key提取逻辑是否正确
你当前代码中提取Key的逻辑是取传入s3Key按/分割的最后一段,仅在所有文件都直接放在images目录下时有效。如果你的文件有多层目录结构,这个逻辑会丢失前面的路径,导致Key错误。如果传入的是完整URL,建议通过URL对象的path属性提取路径,再去掉开头的斜杠和Bucket前缀即可。
4. 检查Bucket版本控制配置
如果你的S3 Bucket开启了版本控制功能,调用普通deleteObject接口只会给对象添加一个删除标记,历史版本的文件仍然会保留在Bucket中。如果需要彻底删除文件,需要调用删除指定版本的接口,或者关闭Bucket的版本控制功能。
5. 确认区域配置一致性
检查你AWSS3.default()初始化时的区域配置,必须和目标Bucket所在的区域完全一致,否则可能出现请求发送到错误区域,删除不存在的对象返回成功的情况。
内容的提问来源于stack exchange,提问作者Krutika Sonawala

