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的一些方法
转载请注明地址~