spring aws s3删除对象不工作

bfnvny8b  于 2022-11-21  发布在  Spring
关注(0)|答案(4)|浏览(204)

我试图上传/删除图像/从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桶,但删除功能似乎出现故障,我得到一个成功的消息,但文件仍然在桶中。
如果有人能帮我解决这个问题,我提前表示感谢。

f5emj3cl

f5emj3cl1#

从deleteObject的javadoc(强调我的)
删除指定存储桶中的指定对象。删除对象后,只有在删除对象时启用了版本控制的情况下,才能还原该对象。

如果尝试删除不存在的对象,Amazon S3将返回成功消息,而不是错误消息。

因此,您在deleteFileFromS3Bucket中构造的路径(fileName)很可能并不指向S3对象。

编辑

我正在根据评论更新我的答案:
使用的文件名包含特殊字符(在提供的示例中为:),这些字符已进行URL编码(百分比编码)。此编码的URL不能用于检索或删除S3对象,因为URL中的百分比将再次进行编码(%编码为%25)。
编码的URL必须进行解码。一种方法是使用java.net.URLDecoder

URLDecoder.decode(encodedPath, "UTF-8")
2ul0zpep

2ul0zpep2#

public boolean deleteFileFromS3Bucket(String fileUrl) {
        String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
        try {
            DeleteObjectsRequest delObjReq = new DeleteObjectsRequest(bucketName).withKeys(fileName);
            s3client.deleteObjects(delObjReq);
            return true;
        } catch (SdkClientException s) {
            return false;
        }
    }

对我来说,在这里工作是一种选择。

6jygbczu

6jygbczu3#

刚刚发现我在new DeleteObjectRequest中添加了一个额外的斜线。

i2byvkas

i2byvkas4#

唯一对我有效的是通过Cyberduck删除它(我既不为Cyberduck工作也不推广Cyberduck,我真诚地使用它,它起作用了)。以下是我所做的步骤:
1.下载并安装Cyberduck。
1.单击打开连接
1.从下拉列表中选择Amazon S3(默认为FTP)
1.输入您的访问密钥ID和秘密访问密钥(如果您没有,则需要通过AWS上的IAM在您的s3桶上创建一个)。
1.你会看到一个你的S3桶列表。选择你想删除的文件或文件夹或桶,右键单击并删除。即使是0kb的文件也会显示在这里,并且可以删除。

相关问题