1.使用
1.1 引入pom.xml
<!--AWS S3上传依赖-->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.490</version>
</dependency>
1.2 使用
创建客户端
AWSCredentials credentials = new BasicAWSCredentials("xxxx", "xxxx");
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTPS);
AmazonS3 conn = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withClientConfiguration(clientConfig)
// 非常重要的参数,被坑惨了
.withPathStyleAccessEnabled(true)
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("https://ceph.xxx.com", Regions.CN_NORTHWEST_1.getName()))
.build();
上传下载
String objectName = "hello.txt";
Date expiration = new Date(System.currentTimeMillis() + 3153600000000l);
Bucket bucket = conn.createBucket("xxxx");
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setExpirationTime(expiration);
// 上传
ByteArrayInputStream input = new ByteArrayInputStream("Hello World!".getBytes());
conn.putObject(bucket.getName(), "hello.txt", input, new ObjectMetadata());
conn.putObject("xxxbuket", objectName, input, new ObjectMetadata());
//下载
String url = conn.getUrl("xxxbuket", objectName).toString();
System.out.println("-------地址---" + url);
2.踩坑
2.1 官网客户端代码过期
去官网找代码示例创建clint ,下载下来发现代码已经过期
java代码过期也能使用吧,这个就不计较了
2.1 发现公网域名无法上传下载
怀疑是版本的问题,请求被拒绝
直接找最新版本的代码,使用AmazonS3ClientBuilder创建参数
还是报错,奇怪怎么跑到二级域名,无奈只能断点到里面,看看是什么配置让他跑到二级域名了
com.amazonaws.services.s3.internal.S3RequestEndpointResolver#resolveRequestEndpoint()
后面三个条件,只要正常的域名就是true,知道看到了第一个参数就知道。
如果不配置isPathStyleAccess,就会把buket拼接到二级域名,离谱的默认配置
2.2 解决增加配置
只需要增加这个配置就可以了
.withPathStyleAccessEnabled(true)