amazonS3文件管理工具类

本文介绍了一个用于Amazon S3文件管理的Java类,包括初始化连接、上传、下载、删除文件及获取链接等功能。通过该类可以实现文件的上传下载、创建桶、获取文件列表等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * @author huaxu
 * @create 2018/12/10
 * @since 1.0.0
 */
public class AmazonS3Manager {

	public static final Logger logger = LoggerFactory.getLogger(AmazonS3Manager.class);

	private static String AMAZON_ENDPOINT_URL;
	private static String AMAZON_AWS_ACCESS_KEY;
	private static String AMAZON_AWS_SECRET_KEY;

	static {

		try {
			AMAZON_ENDPOINT_URL = String.valueOf(PropertyConfigurerUtils.getPropertyValueByKey("amazon.endpoint.url"));
			AMAZON_AWS_ACCESS_KEY = String.valueOf(PropertyConfigurerUtils.getPropertyValueByKey("amazon.access.key"));
			AMAZON_AWS_SECRET_KEY = String.valueOf(PropertyConfigurerUtils.getPropertyValueByKey("amazon.secret.key"));

		} catch (Exception e) {
			logger.error("amazonS3文件服务器基础参数加载出错" + e.getMessage());
		}
		logger.info("amazonS3 文件服务器基础参数加载完成 access_key="+AMAZON_AWS_ACCESS_KEY + " endpoint_url="+AMAZON_ENDPOINT_URL);
	}


	/**
	 * 初始化连接,每次使用需要重新连接
	 */
	public static AmazonS3 initAmazonS3(){

		AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials(AMAZON_AWS_ACCESS_KEY, AMAZON_AWS_SECRET_KEY));
		s3.setRegion(Region.getRegion(Regions.CN_NORTH_1));
		s3.setEndpoint(AMAZON_ENDPOINT_URL);
		s3.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
		return s3;
	}

	/**
	 * 上传文件
	 * @param bucketName 桶名
	 * @param tempFile	待上传文件
	 * @param remoteFileName 文件名
	 * @return
	 */
	public static boolean uploadToS3(String bucketName, File tempFile, String remoteFileName, CannedAccessControlList fileType) {

		try {
			AmazonS3 s3 = initAmazonS3();

			if(!s3.doesBucketExistV2(bucketName)){
				s3.createBucket(bucketName);
			}
			s3.putObject(new PutObjectRequest(bucketName, remoteFileName, tempFile).withCannedAcl(fileType));
			return true;
		} catch (Exception ase) {
			logger.error("amazonS3上传文件File模式异常 " + ase.getMessage(), ase);
		}
		return false;
	}

	/**
	 * 上传文件
	 * @param bucketName 桶名
	 * @param multipartFile 待上传文件
	 * @param remoteFileName 文件名
	 * @return
	 */
	public static boolean uploadToS3(String bucketName, CommonsMultipartFile multipartFile, String remoteFileName, CannedAccessControlList fileType) {

		InputStream in = null;
		try {
			AmazonS3 s3 = initAmazonS3();
			in = multipartFile.getInputStream();
			FileItem fileItem = multipartFile.getFileItem();

			if(!s3.doesBucketExistV2(bucketName)){
				s3.createBucket(bucketName);
			}
			ObjectMetadata omd = new ObjectMetadata();
			omd.setContentType(fileItem.getContentType());
			omd.setContentLength(fileItem.getSize());
			omd.setHeader("filename", fileItem.getName());

			s3.putObject(new PutObjectRequest(bucketName, remoteFileName, in, omd).withCannedAcl(fileType));
			return true;

		} catch (Exception ase) {
			logger.error("amazonS3上传文件InputStream模式异常 " + ase.getMessage(), ase);

		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					logger.error("amazonS3上传文件 关闭InputStream流异常 " + e.getMessage(), e);
				}
			}
		}
		return false;
	}



	/**
	 * 下载文件
	 * @param bucketName	桶名
	 * @param remoteFileName	文件名
	 * @param path	下载路径
	 */
	public static boolean downFromS3(String bucketName, String remoteFileName, String path) {
		try {
			AmazonS3 s3 = initAmazonS3();

			GetObjectRequest request  = new GetObjectRequest(bucketName,remoteFileName);
			s3.getObject(request,new File(path));
			return true;
		} catch (Exception ase) {
			logger.error("amazonS3下载文件异常 " + ase.getMessage(), ase);
		}
		return false;
	}


	/**
	 * 删除文件
	 * @param bucketName	桶名
	 * @param remoteFileName	待删除文件名
	 * @throws IOException
	 */
	public static void delFromS3(String bucketName, String remoteFileName) {
		try {
			AmazonS3 s3 = initAmazonS3();
			s3.deleteObject(bucketName, remoteFileName);
		} catch (Exception ase) {
			logger.error("amazonS3删除文件异常 " + ase.getMessage(), ase);
		}
	}





	/**
	 * 获取短链接 带过期时间
	 * @param bucketName	桶名称
	 * @param remoteFileName	文件名称
	 * @param expiration	过期时间/秒
	 */
	public static String getUrlFromS3(String bucketName, String remoteFileName, int expiration) {
		try {
			AmazonS3 s3 = initAmazonS3();
			GeneratePresignedUrlRequest httpRequest = new GeneratePresignedUrlRequest(bucketName, remoteFileName);
			httpRequest.setExpiration(new Date(new Date().getTime() + expiration * 1000));

			URL url = s3.generatePresignedUrl(httpRequest);
			return String.valueOf(url);
		} catch (Exception e) {
			logger.error("amazonS3获取临时链接异常 " + e.getMessage(), e);
		}
		return null;
	}

	/**
	 * 获取永久链接
	 * @param bucketName	桶名称
	 * @param remoteFileName	文件名称
	 */
	public static String getUrlFromS3(String bucketName, String remoteFileName) {

		String url = "";
		try {
			AmazonS3 s3 = initAmazonS3();
			GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, remoteFileName);

			url = String.valueOf(s3.generatePresignedUrl(urlRequest)).split("\\?")[0];
			if (url.indexOf(remoteFileName) == -1) {
				throw new RuntimeException("url文件名称校验不合法");
			}
			return url;

		} catch (Exception e) {
			logger.error("amazonS3获取永久链接异常 " + e.getMessage(), e);
			return "";
		}
	}

	public static AmazonS3 getS3(){
		return initAmazonS3();
	}

	/**
	 * 根据桶名称获取文件集合
	 */
	public static List<S3ObjectSummary> getFileMsgByBucketName(String bucketName){
		AmazonS3 s3 = initAmazonS3();
		ObjectListing objectListing = s3.listObjects(bucketName);
		List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
		return objectSummaries;
	}
}

 

以下是使用Java语言实现批量上传文件到AWS S3存储的示例代码: ```java import java.io.File; import java.util.List; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.PutObjectRequest; public class S3Util { private static final String S3_ENDPOINT = "your-s3-endpoint-url"; private static final String S3_REGION = "your-s3-region"; private static final String S3_ACCESS_KEY = "your-s3-access-key"; private static final String S3_SECRET_KEY = "your-s3-secret-key"; private static final String S3_BUCKET_NAME = "your-s3-bucket-name"; public static void uploadFiles(List<File> files) { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(S3_ENDPOINT, S3_REGION)) .withCredentials(new DefaultAWSCredentialsProviderChain()) .build(); try { for (File file : files) { String key = file.getName(); PutObjectRequest request = new PutObjectRequest(S3_BUCKET_NAME, key, file); s3Client.putObject(request); } } catch (AmazonServiceException e) { e.printStackTrace(); } catch (SdkClientException e) { e.printStackTrace(); } } } ``` 使用时,只需传入需要上传的文件列表即可: ```java List<File> files = new ArrayList<>(); files.add(new File("file1")); files.add(new File("file2")); S3Util.uploadFiles(files); ``` 在上述代码中,我们使用了AWS SDK的`AmazonS3`客户端,通过`withEndpointConfiguration`方法设置S3的Endpoint URL和Region,`withCredentials`方法设置S3的Access Key和Secret Key,`build`方法创建S3客户端。在上传文件时,我们使用了`PutObjectRequest`对象,其中包含了需要上传的文件、存储桶名称和对象名称,通过`putObject`方法将文件上传到S3存储中。 希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值