package bingsign;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
import java.time.Duration;
import java.util.Map;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
/**
*
* @author chenwei
* https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/example_s3_GetObject_section.html
* @version S3, v2.0 2024/4/10 15:48
**/
// <!-- 添加 AWS SDK for Java V2 的 S3 依赖 -->
// <dependency>
// <groupId>software.amazon.awssdk</groupId>
// <artifactId>s3</artifactId>
// <version>2.17.115</version>
// </dependency>
@Slf4j
public class S3 {
private static String accessKey = "-----";
private static String secretKey = "-----";
private static String region = "-----";
private static String bucketName = "------";
public static void main(String[] args) throws IOException {
getURL("kyx-otc/25befe0dfaa84c0ea7599a34bd7aeef31698889840553.mp4");
upload("saas/555555.jar");
Map<String, String> metadata = Maps.newHashMap();
metadata.put("fileName","kkk.jar");
String presignedGetUrl = createPresignedGetUrl("saas/88888.jar", metadata);
File file = new File("D:\\apache-maven-3.8.6\\lib\\guice-4.2.2-no_aop.jar");
usePresignedUrlPut(presignedGetUrl, file, metadata);
getObjectBytes("saas/88888.jar");
}
/**
* 生成授权url
* 文档地址:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/PresignedUrlUploadObject.html
* 代码示例地址:https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html
* @param keyName
* @return
*/
public static String createPresignedGetUrl(String keyName, Map<String, String> metadata) {
S3Presigner presigner = S3Presigner.builder().region(Region.of(region)).credentialsProvider(
StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey))).build();
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(keyName)
.metadata(metadata)
.build();
PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(10)) // The URL expires in 10 minutes.
.putObjectRequest(objectRequest)
.build();
PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);
String myURL = presignedRequest.url().toString();
System.out.println(myURL);
System.out.println(presignedRequest.url().toExternalForm());
return presignedRequest.url().toExternalForm();
}
public static void upload(String keyName) throws IOException {
AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey);
StaticCredentialsProvider credsProvider = StaticCredentialsProvider.create(awsCreds);
S3Client s3Client = S3Client.builder()
.region(Region.of(region))
.credentialsProvider(credsProvider)
.build();
Map<String, String> metadata = Maps.newHashMap();
metadata.put("namssssse","mmm.jar");
File file = new File("D:\\apache-maven-3.8.6\\lib\\commons-cli-1.4.jar");
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(keyName)
.metadata(metadata)
.build();
try {
PutObjectResponse response = s3Client.putObject(putObjectRequest, RequestBody.fromFile(file));
System.out.println("File uploaded successfully. ETag: " + response.eTag());
} catch (Exception e) {
e.printStackTrace();
} finally {
s3Client.close();
}
}
/**
* 预签名url上传文件
* 文档地址:https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html
* @param presignedUrlString 上传的url
* @param fileToPut 文件内容
* @param metadata
*/
public static void usePresignedUrlPut(String presignedUrlString, File fileToPut, Map<String, String> metadata) {
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
metadata.forEach((k, v) -> requestBuilder.header("x-amz-meta-" + k, v));
HttpClient httpClient = HttpClient.newHttpClient();
try {
final HttpResponse<Void> response = httpClient.send(requestBuilder.uri(new URL(presignedUrlString).toURI())
.PUT(HttpRequest.BodyPublishers.ofFile(Path.of(fileToPut.toURI())))
.build(), HttpResponse.BodyHandlers.discarding());
System.out.println(response);
} catch (URISyntaxException | InterruptedException | IOException e) {
e.printStackTrace();
}
}
/**
* 获取下载的url链接,需要权限
* @param keyName
*/
public static void getURL(String keyName) {
try {
S3Client s3Client = S3Client.builder().region(Region.of(region)).credentialsProvider(
StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey)))
.build();
GetUrlRequest request = GetUrlRequest.builder()
.bucket(bucketName)
.key(keyName)
.build();
URL url = s3Client.utilities().getUrl(request);
System.out.println("=====" + url);
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
}
}
/**
* 读取文件为字节数组
* @param keyName
* @return
*/
public static byte[] getObjectBytes(String keyName) throws IOException {
try {
S3Client s3Client = S3Client.builder().region(Region.of(region)).credentialsProvider(
StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey)))
.build();
GetObjectRequest objectRequest = GetObjectRequest
.builder()
.key(keyName)
.bucket(bucketName)
.build();
ResponseBytes<GetObjectResponse> objectBytes = s3Client.getObjectAsBytes(objectRequest);
Map<String, String> metadata = objectBytes.response().metadata();
System.out.println(metadata);
byte[] data = objectBytes.asByteArray();
// // Write the data to a local file.
// File myFile = File.createTempFile("kkkkkkkkkkkkk",".jar");
// System.out.println(myFile.getAbsolutePath());
// OutputStream os = new FileOutputStream(myFile);
// os.write(data);
// System.out.println("Successfully obtained bytes from an S3 object");
// os.close();
return data;
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
}
}
}
AWS存储S3上传、下载、预签名url
最新推荐文章于 2024-09-15 07:44:52 发布