我尝试使用spring boot上传/删除aws s3存储桶中的图像。
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存储桶,但删除功能似乎出现故障,我收到一条成功的消息,但该文件仍在存储桶中。
如果有人能帮我解决问题,请提前致谢。
答案 0 :(得分:0)
来自deleteObject的javadoc(强调我的)
删除指定存储桶中的指定对象。删除后,只有在删除对象时启用了版本控制才能恢复该对象。
如果尝试删除不存在的对象,Amazon S3将返回成功消息而不是错误消息。
因此,您在fileName
中构建的路径(deleteFileFromS3Bucket
)很可能不会指向S3对象。
修改强>
我根据评论更新了我的答案:
使用的文件名具有特殊字符(在提供的示例中为:
),其获得URL编码(编码百分比)。此编码的网址不能用于检索或删除S3对象,因为网址中的百分比会再次被编码(%
被编码为%25
)。
必须解码编码的URL。一种方法是使用java.net.URLDecoder
URLDecoder.decode(encodedPath, "UTF-8")
答案 1 :(得分:0)
刚刚发现我在new DeleteObjectRequest
添加了一个额外的斜杠。
答案 2 :(得分:0)
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;
}
}
对我来说,在这里工作是一种选择。
答案 3 :(得分:-1)
我试图查看提到的许多解决方案。唯一对我有用的是通过Cyberduck删除它(我既不为它工作,也不在提倡Cyberduck,我确实使用过它并且起作用了)。这是我所做的步骤:
1-下载并安装Cyberduck。
2-单击打开连接
3-从下拉列表中选择Amazon S3(默认为FTP)
4-输入访问密钥ID和秘密访问密钥(如果没有,则需要通过AWS上的IAM在s3存储桶中创建一个)
5-您将看到S3存储桶的列表。选择要删除的文件或文件夹或存储桶,右键单击并删除。甚至0kb的文件也会显示在此处,可以删除。
希望这会有所帮助