Java 弹簧靴&x2B;AWS S3:无法删除存储桶中的文件
我是AWS新手,我尝试学习的第一个模块是S3,用于文件存储 上传工作正常,问题在于删除。因此,当我上传文件时,我会将文件名的字符串版本存储在AWS bucketJava 弹簧靴&x2B;AWS S3:无法删除存储桶中的文件,java,spring,amazon-web-services,spring-boot,amazon-s3,Java,Spring,Amazon Web Services,Spring Boot,Amazon S3,我是AWS新手,我尝试学习的第一个模块是S3,用于文件存储 上传工作正常,问题在于删除。因此,当我上传文件时,我会将文件名的字符串版本存储在AWS bucketmybucket中,并将整个URL存储在mysql数据库中,如下所示 ->https://mybucket.s3.eu-west-2.amazonaws.com/what.png 删除的问题是,即使在本例中我传递了整个URLhttps://mybucket.s3.eu-west-2.amazonaws.com/what.png对于dele
mybucket
中,并将整个URL存储在mysql数据库中,如下所示
->https://mybucket.s3.eu-west-2.amazonaws.com/what.png
删除的问题是,即使在本例中我传递了整个URLhttps://mybucket.s3.eu-west-2.amazonaws.com/what.png
对于delete方法,该方法会成功执行每个步骤,告诉我文件已成功删除,但当我检查bucket时,文件仍然存在。我尝试在这里搜索类似的问题,但找不到可以帮助我理解问题所在的内容。下面是代码
@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");
}
当我调用delete方法时,我使用
@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";
}
任何帮助都将不胜感激
L.E适用于有相同问题并搜索快速答案的任何人。您只需将字符串图像名称传递给删除方法,而不是整个URL。您没有检查从
amazonS3.deleteObject()
返回的响应,以查看它是否实际成功。它可能正在返回故障状态
我猜根本的问题是您将完整的URL传递给delete方法,而不仅仅是S3中文件的路径。例如,此URL:
https://mybucket.s3.eu-west-2.amazonaws.com/what.png
S3对象路径只是what.png
Aws S3最终是一致的。您可以删除对象并在浏览器中列出该对象。因此,删除只需几秒钟或更短的时间
请参考此链接最简单的答案是使用该类。比如:
URL url = null;
try {
url = new URL("https://mybucket.s3.eu-west-2.amazonaws.com/some/path/what.png");
} catch (MalformedURLException e) {
e.printStackTrace();
}
System.out.println( "file is \""+ url.getFile() + "\"" );
输出将是“/some/path/what.png”。您可以删除用于键的第一个“/”字符。该方法返回void(请参阅V1文档)是的,我刚刚签出,该方法返回void。我确实可以通过传递what.png来检查,但是当我将整个URL保存在mysql db列中时,我该怎么做呢https://mybucket.s3.eu-west-2.amazonaws.com/what.png当我调用getImage()时方法返回整个URL。如何将文件名与URL分离?这是一个有点不同的问题-如何解析URL的部分。好的,我可以确认,当我将
what.png
直接传递给方法时,它会删除文件,但我的问题仍然存在,因为我不知道如何将文件名与整个URL分离。有什么帮助吗?@stdunbar最新版本返回一个响应,我每次等待超过1分钟,文件仍在那里。请检查该存储桶中是否启用了版本控制