# Bucket

### Bucket 簡單說明及自身經驗

參考資料：[官方文件](https://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/Welcome.html)

首先這邊主要的問題是`aws-java-sdk` 這包太大，這個問題還是要想辦法解決，目前在想辦法。

```
// 使用 AWS S3 SDK
// https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk
implementation 'com.amazonaws:aws-java-sdk:1.12.211'
```

### Config

```java
@Configuration
public class AWSS3Config {

	@Value("${custom.aws.accessKey}")
	private String accessKey;

	@Value("${custom.aws.secretKey}")
	private String secretKey;

	@Value("${custom.aws.area}")
	private String area;


	@Bean
	public AmazonS3 createAWSS3Client() {
		AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

		//set-up the client
		AmazonS3 s3client = AmazonS3ClientBuilder
				.standard()
				.withCredentials(new AWSStaticCredentialsProvider(credentials))
				.withRegion(Regions.fromName(area))
				.build();

		return s3client;
	}
}
```

### Service

```java
@Service
@RequiredArgsConstructor
public class AWSS3StorageService {

	@Value("${custom.aws.bucketName}")
	private String bucketName;

	@Value("${custom.aws.baseFolder}")
	private String baseFolder;

	@Value("${custom.aws.area}")
	private String area;


	private final AmazonS3 s3client;

	public String getObjectKey(String key){
		return baseFolder + "/" + key;
	}

	public String getAWSPath(String key){
		return "https://" + this.bucketName + ".s3." + area +".amazonaws.com/" + baseFolder + "/" + key;
	}

	//is bucket exist?
	public boolean doesBucketExist(String bucketName) {
		return s3client.doesBucketExistV2(bucketName);
	}

	//create a bucket
	public Bucket createBucket(String bucketName) {
		return s3client.createBucket(bucketName);
	}

	//list all buckets
	public List<Bucket> listBuckets() {
		return s3client.listBuckets();
	}

	//delete a bucket
	public void deleteBucket(String bucketName) {
		s3client.deleteBucket(bucketName);
	}

	//uploading object
	public PutObjectResult putObject(String bucketName, String key, File file) {
		return s3client.putObject(bucketName, baseFolder + "/" + key, file);
	}
	public PutObjectResult putObject(String key, File file) {
		return s3client.putObject(this.bucketName, baseFolder + "/" + key, file);
	}

	//uploading object from inputStream
	public PutObjectResult putObject(String key, InputStream input, String contentType) {
		ObjectMetadata metadata = new ObjectMetadata();
		metadata.setContentType(contentType);
		return s3client.putObject(this.bucketName, baseFolder + "/" + key, input, metadata);
	}

	//listing objects
	public ObjectListing listObjects(String bucketName) {
		return s3client.listObjects(bucketName);
	}

	//get an object
	public S3Object getObject(String bucketName, String objectKey) {
		return s3client.getObject(bucketName, baseFolder + "/" + objectKey);
	}

	//copying an object
	public CopyObjectResult copyObject(String sourceBucketName, String sourceKey,
									   String destinationBucketName, String destinationKey) {
		return s3client.copyObject(sourceBucketName, sourceKey,
										destinationBucketName, destinationKey);
	}

	//deleting an object
	public void deleteObject(String bucketName, String objectKey) {
		s3client.deleteObject(bucketName, baseFolder + "/" + objectKey);
	}

	//deleting an object
	public void deleteObject(String objectKey) {
		deleteObject(this.bucketName, baseFolder + "/" + objectKey);
	}

	//deleting multiple Objects
	public DeleteObjectsResult deleteObjects(DeleteObjectsRequest delObjReq) {
		return s3client.deleteObjects(delObjReq);
	}
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xu-min-chang.gitbook.io/caster-develop-note/java/cloud-platform/amazon-s3/sdk-v1/bucket.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
