|
|
|
@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
package com.leaper.web.task;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.amazonaws.ClientConfiguration;
|
|
|
|
|
|
|
|
import com.amazonaws.Protocol;
|
|
|
|
|
|
|
|
import com.amazonaws.SdkClientException;
|
|
|
|
|
|
|
|
import com.amazonaws.auth.AWSCredentials;
|
|
|
|
|
|
|
|
import com.amazonaws.auth.AWSStaticCredentialsProvider;
|
|
|
|
|
|
|
|
import com.amazonaws.auth.BasicAWSCredentials;
|
|
|
|
|
|
|
|
import com.amazonaws.client.builder.AwsClientBuilder;
|
|
|
|
|
|
|
|
import com.amazonaws.regions.Regions;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.AmazonS3;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.AmazonS3Client;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.GetObjectRequest;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.ObjectMetadata;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.PutObjectResult;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.S3Object;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.S3ObjectInputStream;
|
|
|
|
|
|
|
|
import com.amazonaws.services.s3.transfer.internal.TransferManagerUtils;
|
|
|
|
|
|
|
|
import com.amazonaws.util.IOUtils;
|
|
|
|
|
|
|
|
import com.amazonaws.util.json.Jackson;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
|
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class S3Utils {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Logger LOGGER = Logger.getLogger("S3Utils");
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* S3客户端接口
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public AmazonS3 s3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 用作分片并行上传下载异步任务执行线程;该示例客户端实例上调用的并行上传下载异步任务都提交到此执行线程运行,请合理设置该执行线程的线程池大小;或者并行上传下载方法单独创建异步任务执行线程;
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private ExecutorService executorService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 客户端初始化
|
|
|
|
|
|
|
|
* @param accessKey AK
|
|
|
|
|
|
|
|
* @param secretKey SK
|
|
|
|
|
|
|
|
* @param host endpoint S3服务地址
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public void init(String accessKey, String secretKey, String host) {
|
|
|
|
|
|
|
|
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
|
|
|
|
|
|
|
|
ClientConfiguration config = new ClientConfiguration();
|
|
|
|
|
|
|
|
config.setProtocol(Protocol.HTTP);
|
|
|
|
|
|
|
|
//config.setRetryPolicy(PredefinedRetryPolicies.NO_RETRY_POLICY);
|
|
|
|
|
|
|
|
// 凭证验证方式
|
|
|
|
|
|
|
|
config.setSignerOverride("S3SignerType");
|
|
|
|
|
|
|
|
config.setSocketTimeout(180000);
|
|
|
|
|
|
|
|
config.setMaxConnections(50);
|
|
|
|
|
|
|
|
config.setConnectionTimeout(10000);
|
|
|
|
|
|
|
|
// 创建S3客户端,使用完需要关闭((AmazonS3Client) s3).shutdown();
|
|
|
|
|
|
|
|
s3 = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
|
|
|
|
|
|
|
|
.withClientConfiguration(config)
|
|
|
|
|
|
|
|
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(host, Regions.US_EAST_1.getName())).enablePathStyleAccess().build();
|
|
|
|
|
|
|
|
//创建默认线程(10个固定线程)执行器,使用分片并行传输时用作执行线程,可以根据自己需求实现执行器。
|
|
|
|
|
|
|
|
executorService = TransferManagerUtils.createDefaultExecutorService();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 客户端销毁
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public void destroy() {
|
|
|
|
|
|
|
|
executorService.shutdown();
|
|
|
|
|
|
|
|
((AmazonS3Client) s3).shutdown();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 上传对象
|
|
|
|
|
|
|
|
* @param bucketName 桶名称
|
|
|
|
|
|
|
|
* @param fileName 对象名称,图片名称
|
|
|
|
|
|
|
|
* @param file 文件
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public PutObjectResult uploadFile(String bucketName, String fileName, File file) {
|
|
|
|
|
|
|
|
PutObjectResult putObjectResult = s3.putObject(bucketName, fileName, file);
|
|
|
|
|
|
|
|
LOGGER.info(Jackson.toJsonPrettyString(putObjectResult));
|
|
|
|
|
|
|
|
LOGGER.info("upload object " + fileName + " success.");
|
|
|
|
|
|
|
|
return putObjectResult;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 下载对象
|
|
|
|
|
|
|
|
* @param bucketName bucket名称
|
|
|
|
|
|
|
|
* @param key 对象名称
|
|
|
|
|
|
|
|
* @param destinationFile 存储为本地的目标文件名
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public ObjectMetadata downloadFile(String bucketName, String key, String destinationFile) {
|
|
|
|
|
|
|
|
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
|
|
|
|
|
|
|
|
ObjectMetadata objectMetadata = s3.getObject(getObjectRequest, new File(destinationFile));
|
|
|
|
|
|
|
|
LOGGER.info(Jackson.toJsonPrettyString(objectMetadata));
|
|
|
|
|
|
|
|
LOGGER.info("download object " + key + " success.");
|
|
|
|
|
|
|
|
return objectMetadata;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 上传流对象
|
|
|
|
|
|
|
|
* @param bucketName bucket名称
|
|
|
|
|
|
|
|
* @param key 对象名称
|
|
|
|
|
|
|
|
* @param inputStream 上传内容
|
|
|
|
|
|
|
|
* @param objectMetadata 上传内容元数据,Content-Length必须设置
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public PutObjectResult uploadStream(String bucketName, String key, InputStream inputStream, ObjectMetadata objectMetadata) {
|
|
|
|
|
|
|
|
PutObjectResult putObjectResult = s3.putObject(bucketName, key, inputStream, objectMetadata);
|
|
|
|
|
|
|
|
LOGGER.info(Jackson.toJsonPrettyString(putObjectResult));
|
|
|
|
|
|
|
|
LOGGER.info("upload object " + key + " success.");
|
|
|
|
|
|
|
|
return putObjectResult;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 下载对象到流
|
|
|
|
|
|
|
|
* @param bucketName bucket名称
|
|
|
|
|
|
|
|
* @param key 对象名称
|
|
|
|
|
|
|
|
* @param out 输出流
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public ObjectMetadata downloadStream(String bucketName, String key, OutputStream out) {
|
|
|
|
|
|
|
|
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
|
|
|
|
|
|
|
|
S3Object s3Object = s3.getObject(getObjectRequest);
|
|
|
|
|
|
|
|
ObjectMetadata objectMetadata = s3Object.getObjectMetadata();
|
|
|
|
|
|
|
|
S3ObjectInputStream in = s3Object.getObjectContent();
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
IOUtils.copy(in, out);
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
|
|
|
throw new SdkClientException(e);
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
IOUtils.release(in, null);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
LOGGER.info(Jackson.toJsonPrettyString(objectMetadata));
|
|
|
|
|
|
|
|
LOGGER.info("download object " + key + " success.");
|
|
|
|
|
|
|
|
return objectMetadata;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|