Java使用S3的一些操作

2 篇文章 0 订阅

Java使用S3的一些操作

首先下载所需要的包

		<dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.868</version>
        </dependency>

然后就是自己封装的一些S3方法了 上完整代码

package com.idp.cmarket.aws;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;

import java.io.IOException;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.IntStream;

/**
 * @author jiawei.zhao
 * Date: 2021/05/24 15:31
 */
@Component
public class S3Util {

	/**
	 * 禁用调用无参构造函数
	 */
	private S3Util() {

	}

	private static String accessKeyId = "";

	private static String accessKeySecret = "";

	private static String bucketName = "";

	private static String regionName = "cn-north-1";

	private static String S3Url ="https://test.s3.cn-north-1.amazonaws.com.cn/";

	/**
	 * S3初始化
	 * @return
	 */
	public static AmazonS3 amazonS3() {
		AWSCredentials awsCredentials = new BasicAWSCredentials(accessKeyId, accessKeySecret);
		AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
		//设置S3的地区
		builder.setRegion(regionName);
		AmazonS3 s3Client = builder.build();
		return s3Client;
	}

	/**
	 * 上传图片到S3
	 * @param url
	 * @return
	 * @throws Exception
	 */
	public static String upload(String url,String directory) throws Exception {
		AmazonS3 amazonS3Client = amazonS3();
		//将url转为MultipartFile对象
		MultipartFile file = urlToMultipartFile(url);
		//通过url获取图片名称
		String fileName = getFileName(url);
		if(StringUtils.isNotEmpty(directory)){
			fileName=directory+"/"+fileName;
		}
		ObjectMetadata objectMetadata = new ObjectMetadata();
		objectMetadata.setContentType(file.getContentType());
		objectMetadata.setContentLength(file.getSize());
		//调用S3上传文件
		PutObjectResult putObjectRequest = amazonS3Client.
				putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), objectMetadata)
						.withCannedAcl(CannedAccessControlList.PublicRead));
		return S3Url+fileName;
	}
	/**
	 * 下载文件到本地
	 * @param fileName
	 * @return
	 * @throws Exception
	 */
	public static boolean downLoad(String fileName, String filePath) throws Exception{
		AmazonS3 amazonS3Client = amazonS3();
		S3Object object = amazonS3Client.getObject(new GetObjectRequest(bucketName,fileName));
		if(object!=null){
			InputStream input = null;
			FileOutputStream fileOutputStream = null;
			byte[] data = null;
			try {
				//获取文件流
				input=object.getObjectContent();
				data = new byte[input.available()];
				int len = 0;
				fileOutputStream = new FileOutputStream(filePath);
				while ((len = input.read(data)) != -1) {
					fileOutputStream.write(data, 0, len);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				if(fileOutputStream!=null){
					try {
						fileOutputStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				if(input!=null){
					try {
						input.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
		return true;
	}

	/**
	 * 读取S3的Excel数据
	 * @param fileName
	 * @return
	 * @throws Exception
	 */
	public static S3Object readExcelDataForS3(String fileName,String directory) throws Exception{
		AmazonS3 amazonS3Client = amazonS3();
		if(StringUtils.isNotEmpty(directory)){
			fileName=directory+"/"+fileName;
		}
		return amazonS3Client.getObject(new GetObjectRequest(bucketName,fileName));
	}

	/**
	 * 移动文件
	 * @param fileName
	 * @param moverFileName
	 */
	public static void moveFile(String fileName,String moverFileName){
		try{
			AmazonS3 amazonS3Client = amazonS3();
			//目前哪个桶 目前的文件名 移动到的桶 移动过去的文件名
			CopyObjectResult copyFile = amazonS3Client.copyObject(bucketName, fileName, bucketName, moverFileName);
			//判断是否上传成功
			if(StringUtils.isNotEmpty(copyFile.getETag())){
				//将当前桶中的文件删除
				amazonS3Client.deleteObject(bucketName, fileName);
			}
		}catch (AmazonServiceException e) {
			System.err.println(e.getErrorMessage());
			System.exit(1);
		}
	}


	/**
	 * 获取文件列表
	 * @param limit
	 * @param prefix
	 * @return
	 * @throws IOException
	 */
	public static List<S3ObjectSummary> getFileListPaginator(Integer limit,String prefix) throws IOException{
		try {
			AmazonS3 amazonS3Client = amazonS3();
			ListObjectsV2Request req = new ListObjectsV2Request()
					.withBucketName(bucketName).withMaxKeys(limit).withPrefix(prefix);
			ListObjectsV2Result result;
			result = amazonS3Client.listObjectsV2(req);
//			for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
//				System.out.printf(" - %s (size: %d)\n", objectSummary.getKey(), objectSummary.getSize());
//			}
			result.setTruncated(true);
			return result.getObjectSummaries();
		} catch (AmazonServiceException e) {
			// 已经打通S3但处理失败
			e.printStackTrace();
		} catch (SdkClientException e) {
			// 链接S3失败
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * url转MultipartFile
	 * @param url
	 * @return
	 * @throws Exception
	 */
	public static MultipartFile urlToMultipartFile(String url) throws Exception {
		File file = null;
		MultipartFile multipartFile = null;
		try {
			HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
			httpUrl.connect();
			file = inputStreamToFile(httpUrl.getInputStream(),"template.png");

			multipartFile = fileToMultipartFile(file);
			httpUrl.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return multipartFile;
	}

	/**
	 * inputStream 转 File
	 * @param ins
	 * @param name
	 * @return
	 * @throws Exception
	 */
	public static File inputStreamToFile(InputStream ins, String name) throws Exception{
		File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
		OutputStream os = new FileOutputStream(file);
		int bytesRead;
		int len = 8192;
		byte[] buffer = new byte[len];
		while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
			os.write(buffer, 0, bytesRead);
		}
		os.close();
		ins.close();
		return file;
	}

	/**
	 * file转multipartFile
	 * @param file
	 * @return
	 */
	public static MultipartFile fileToMultipartFile(File file) {
		FileItemFactory factory = new DiskFileItemFactory(16, null);
		FileItem item=factory.createItem(file.getName(),"text/plain",true,file.getName());
		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		try {
			FileInputStream fis = new FileInputStream(file);
			OutputStream os = item.getOutputStream();
			while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
				os.write(buffer, 0, bytesRead);
			}
			os.close();
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new CommonsMultipartFile(item);
	}

	/**
	 * 根据正则获取HC图片名称
	 * @param url
	 * @return
	 */
	public static String getFileName(String url){
		//指定图片后缀名称
		String suffixes="bmp|jpg|jpeg|png|gif|BMP|JPG|JPEG|PNG|GIF";
		Pattern pat=Pattern.compile("[\\w]+[\\.]("+suffixes+")");//正则判断
		Matcher mc=pat.matcher(url);//条件匹配
		while(mc.find()) {
			String fileName= mc.group();
			return fileName;
		}
		return url;
	}

}

以上就是Java操作S3的一些方法
转载请注明地址~

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中配置S3连接池,您需要使用AWS SDK for Java。以下是一个简单的示例,演示如何配置并使用S3连接池: 首先,确保您已将以下依赖项添加到您的项目的pom.xml文件中(如果您使用的是Maven): ```xml <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> </dependencies> ``` 接下来,您可以使用以下代码片段来配置和使用S3连接池: ```java import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3Configuration; import software.amazon.awssdk.services.s3.S3Object; import java.util.concurrent.Executors; public class S3ConnectionPoolExample { private static final int CONNECTION_POOL_SIZE = 10; public static void main(String[] args) { // 创建连接池配置 S3Configuration s3Config = S3Configuration.builder() .checksumValidationEnabled(false) .build(); // 创建连接池 S3Client s3Client = S3Client.builder() .region(Region.US_WEST_2) .credentialsProvider(DefaultCredentialsProvider.create()) .serviceConfiguration(s3Config) .httpClientBuilder(UrlConnectionHttpClient.builder()) .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(30)) .build()) .httpClientBuilder(NettyNioAsyncHttpClient.builder() .maxConcurrency(CONNECTION_POOL_SIZE) .connectionTimeout(Duration.ofSeconds(10)) .connectionAcquisitionTimeout(Duration.ofSeconds(10)) .build()) .build(); // 使用连接池执行操作 for (int i = 0; i < 10; i++) { Executors.newFixedThreadPool(CONNECTION_POOL_SIZE).submit(() -> { S3Object s3Object = s3Client.getObject(GetObjectRequest.builder() .bucket("your-bucket-name") .key("your-object-key") .build()); // 处理S3对象 // ... }); } // 关闭连接池 s3Client.close(); } } ``` 请注意,这只是一个简单的示例。您需要根据您的实际需求进行适当的配置和处理。 希望这可以帮助您开始使用Java配置S3连接池!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值