java - Spring Boot + AWS S3:无法删除存储桶中的文件
问题描述
我是 AWS 的新手,我尝试学习的第一个模块是用于文件存储的 S3。
上传工作正常,问题在于删除。所以当我上传文件时,我将文件名的字符串版本存储在 AWS 存储桶中mybucket
,并将整个 URL 存储在 mysql 数据库中,如下所示 - >https://mybucket.s3.eu-west-2.amazonaws.com/what.png
删除的问题是,即使我在这种情况下将整个 URL 传递https://mybucket.s3.eu-west-2.amazonaws.com/what.png
给 delete 方法,该方法也会成功执行每个步骤,告诉我文件已成功删除,但是当我检查存储桶时,文件仍然存在.我试过在这里搜索类似的问题,但找不到可以帮助我理解问题所在的东西。这是代码
@Service
public class AmazonS3ClientServiceImpl {
private String awsS3AudioBucket; //bucket name
private AmazonS3 amazonS3; // s3 object which uploads file
private static final Logger logger = LoggerFactory.getLogger(AmazonS3ClientServiceImpl.class);
@Autowired
public AmazonS3ClientServiceImpl(Region awsRegion, AWSCredentialsProvider awsCredentialsProvider, String awsS3AudioBucket) {
this.amazonS3 = AmazonS3ClientBuilder.standard()
.withCredentials(awsCredentialsProvider)
.withRegion(awsRegion.getName()).build();
this.awsS3AudioBucket = awsS3AudioBucket;
}
public String uploadFileToS3Bucket(MultipartFile multipartFile, boolean enablePublicReadAccess) {
String uploadedfile = ""; // the file path which is on s3
String fileName = multipartFile.getOriginalFilename();
try {
//creating the file in the server (temporarily)
File file = new File(fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(multipartFile.getBytes());
fos.close();
PutObjectRequest putObjectRequest = new PutObjectRequest(this.awsS3AudioBucket, fileName, file);
if (enablePublicReadAccess) {
putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);
}
this.amazonS3.putObject(putObjectRequest);
uploadedfile = String.valueOf(this.amazonS3.getUrl(awsS3AudioBucket, fileName));
System.out.println(this.amazonS3.getUrl(awsS3AudioBucket, fileName));
System.out.println(uploadedfile);
//removing the file created in the server
file.delete();
} catch (IOException | AmazonServiceException ex) {
logger.error("error [" + ex.getMessage() + "] occurred while uploading [" + fileName + "] ");
}
return uploadedfile;
}
public void deleteFileFromS3Bucket(String fileName) {
LOGGER.info("Deleting file with name= " + fileName);
final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.awsS3AudioBucket, fileName);
amazonS3.deleteObject(deleteObjectRequest);
LOGGER.info("File deleted successfully");
}
当我调用 deletemethod 时,我使用它
@GetMapping("/dashboard/showposts/delete/{id}")
public String deletePost(@PathVariable("id") Long id, Model model) {
System.out.println("GOT HERE");
//Retrieving Post image name
Post post = postService.findBydId(id);
String imageName = post.getImage();
System.out.println(imageName);
//Deleting image from S3 bucket
amazonClient.deleteFileFromS3Bucket(imageName);
//Deleting post from db
postService.detelePost(id);
String success = "Successfully deleted post with Id" + id;
model.addAttribute("success", success);
return "redirect:/admin/dashboard/showposts";
}
任何帮助将不胜感激。
LE对于遇到相同问题并正在寻找快速答案的任何人。您只需将字符串图像名称传递给删除方法,而不是整个 URL。
解决方案
您没有检查返回的响应amazonS3.deleteObject()
以查看它是否真的成功。它可能正在返回失败状态。
我猜根本问题是您将完整的 URL 传递给 delete 方法,而不仅仅是 S3 中文件的路径。例如,使用此 URL:https://mybucket.s3.eu-west-2.amazonaws.com/what.png
S3 对象路径是简单的what.png
.
推荐阅读
- java - 如何验证具有超长 UTF-8 编码字符的字符串?
- java - 无法使用 JSP 从 mySQL 数据库中获取数据
- python - 如何在 Python 脚本运行时让 Logger 写入文件
- amazon-s3 - 将 Rusoto S3 StreamingBody 读入 Brotli 可以解压的东西
- python - 仅当存在于 X 个其他子列表中时才保留嵌套列表中的项目
- ruby-on-rails - 访问没有端口号的 docker-compose extra_hosts
- amazon-web-services - 在 Amazon S3 中,其他用户看不到相同的存储桶
- c# - 从 Unity AudioClip 创建一个 .WAV 文件
- sql-server - 我公司的所有服务器名称都以“SW”开头,它代表什么?所有公司的情况都一样吗?
- java - 尝试将文件加载到 hdfs 时出错