我试图上传/删除图像/从aws s3桶使用 Spring Boot 。
public class AmazonClient {
private AmazonS3 s3client;
private void initializeAmazon() {
AWSCredentials credentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
this.s3client = AmazonS3ClientBuilder.standard().withRegion(region).withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
}
private void uploadFileTos3bucket(String fileName, File file) {
s3client.putObject(new PutObjectRequest(bucketName, fileName, file)
.withCannedAcl(CannedAccessControlList.PublicRead));
}
public void deleteFileFromS3Bucket(String fileUrl) {
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
s3client.deleteObject(new DeleteObjectRequest(bucketName + "/", fileName));
}
}
上传功能运行良好,我可以看到文件已经上传到s3桶,但删除功能似乎出现故障,我得到一个成功的消息,但文件仍然在桶中。
如果有人能帮我解决这个问题,我提前表示感谢。
4条答案
按热度按时间f5emj3cl1#
从deleteObject的javadoc(强调我的)
删除指定存储桶中的指定对象。删除对象后,只有在删除对象时启用了版本控制的情况下,才能还原该对象。
如果尝试删除不存在的对象,Amazon S3将返回成功消息,而不是错误消息。
因此,您在
deleteFileFromS3Bucket
中构造的路径(fileName
)很可能并不指向S3对象。编辑
我正在根据评论更新我的答案:
使用的文件名包含特殊字符(在提供的示例中为
:
),这些字符已进行URL编码(百分比编码)。此编码的URL不能用于检索或删除S3对象,因为URL中的百分比将再次进行编码(%
编码为%25
)。编码的URL必须进行解码。一种方法是使用java.net.URLDecoder
2ul0zpep2#
对我来说,在这里工作是一种选择。
6jygbczu3#
刚刚发现我在
new DeleteObjectRequest
中添加了一个额外的斜线。i2byvkas4#
唯一对我有效的是通过Cyberduck删除它(我既不为Cyberduck工作也不推广Cyberduck,我真诚地使用它,它起作用了)。以下是我所做的步骤:
1.下载并安装Cyberduck。
1.单击打开连接
1.从下拉列表中选择Amazon S3(默认为FTP)
1.输入您的访问密钥ID和秘密访问密钥(如果您没有,则需要通过AWS上的IAM在您的s3桶上创建一个)。
1.你会看到一个你的S3桶列表。选择你想删除的文件或文件夹或桶,右键单击并删除。即使是0kb的文件也会显示在这里,并且可以删除。