公司采用S3来存贮图片资源, 于是写了一套S3的简单封装来供其他人调用. 东西没多复杂, 就是亚马逊的官方文档和迷宫一样...
AWS
创建客户端
要提交请求至 Amazon Web Services,您首先要创建一个服务客户端对象。推荐的方法是使用服务客户端生成器。
AWS 凭证
Amazon Web Services 提交请求,您必须为 AWS SDK for Java 提供 AWS 凭证。使用默认凭证提供程序链来提供凭证,会从几个位置(环境变量、java环境变量、默认凭证配置文件 – 通常位于 ~/.aws/credentials (此位置可能因平台而异))
区域
要显式设置区域时,我们建议您使用 Regions 枚举。
使用生成器所构建的客户端不可改变,而且不能更改区域。如果要为同一项服务使用多个 AWS 区域,请创建多个客户端,即每个区域一个客户端。
异常 日志
AmazonServiceException (和子类)
使用Commons Logging 作为门面, 使用其他日志门面的同学注意转一下.
访问控制策略
向任何人授予读取某个存储桶中所有对象的权限,但仅允许两个特定的 AWS 账户 (除了存储桶所有者的账户之外) 将对象上传到该存储桶。
存储桶限制
- 每个账户最多创建100个,超过可申请。
- 为空可以删掉,但名字不见得能重用,因为其他用户可能在用。所以说不要随便删除。
- 区域不能改,且要和创建客户端的区域得相同,要不可能报错。
- 创建和删除应该单独初始化
存储桶命名规则
- 不支持大写字母、下划线,唯一,至少3个字符
- 必须以小写字母或者数字开头
- 存储桶名称必须是一系列的一个或多个标签。相邻标签通过单个句点 (.) 分隔。存储桶名称可以包含小写字母、数字和连字符。每个标签都必须以小写字母或数字开头和结尾。
- 不能用ip地址...
package com.kd.exchange.common.s3;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
/**
* @author KLOOOP
* @date 2018/8/11
*/
public class AmazonS3Utils {
private static final Logger LOGGER = LoggerFactory.getLogger(AmazonS3Utils.class);
private static final String FILE_TYPE = "fileType";
/**
* keyID
*/
private static String accessKeyID = "XXXXXX";
/**
* key
*/
private static String secretKey = "YYYYYYYYYYY";
/**
* 向 AWS 客户端明确提供凭证
*/
private static final BasicAWSCredentials AWS_CREDENTIALS = new BasicAWSCredentials(accessKeyID, secretKey);
/**
* s3 客户端
*/
private static final AmazonS3 S3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(AWS_CREDENTIALS))
.withRegion(Regions.AP_NORTHEAST_1)
.build();
/**
* 存放文件至s3
*
* @param bucketName 桶名称 AmazonS3BucketConstant
* @param key key名称
* @param file 文件
* @return PutObjectResult
*/
public static PutObjectResult putFile(String bucketName, String key, File file) {
if (StringUtils.isBlank(bucketName)
|| StringUtils.isBlank(key)
|| file == null
|| file.length() == 0L) {
LOGGER.error("Amazon S3 上传文件参数非法");
return null;
}
long startMillis = System.currentTimeMillis();
long endMillis;
PutObjectResult result = null;
try {
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
String name = file.getName();
// 记录文件类型
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata(FILE_TYPE, name.substring(name.lastIndexOf(".") + 1));
putObjectRequest.setMetadata(metadata);
result = S3.putObject(putObjectRequest);
endMillis = System.currentTimeMillis();
LOGGER.info("上传成功,耗时 : " + (endMillis - startMillis));
} catch (AmazonServiceException e) {
endMillis = System.currentTimeMillis();
LOGGER.error(e.getMessage(), e);
LOGGER.error("上传失败,耗时 : " + (endMillis - startMillis));
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
LOGGER.error(e.getMessage());
}
return result;
}
/**
* 读取文件
*
* @param bucketName 桶名称 AmazonS3BucketConstant
* @param key key名称
* @return S3Object: s3Object.getBucketName(); s3Object.getKey(); InputStream inputStream = s3Object.getObjectContent()...
* 务必关闭 S3Object: s3Object.close();
*/
public static S3Object getFile(String bucketName, String key) {
if (StringUtils.isBlank(bucketName) || StringUtils.isBlank(key)) {
LOGGER.error("Amazon S3 下载文件参数非法");
return null;
}
long startMillis = System.currentTimeMillis();
long endMillis;
S3Object s3Object = null;
try {
s3Object = S3.getObject(bucketName, key);
endMillis = System.currentTimeMillis();
LOGGER.info("下载成功,耗时 : " + (endMillis - startMillis));
} catch (AmazonServiceException e) {
endMillis = System.currentTimeMillis();
LOGGER.error(e.getMessage(), e);
LOGGER.error("下载失败,耗时 : " + (endMillis - startMillis));
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
LOGGER.error(e.getMessage());
}
return s3Object;
}
}