- @return
*/
public static String upload(MultipartFile multipartFile) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = multipartFile.getInputStream();
// 获取文件名称
String fileName = multipartFile.getOriginalFilename();
// 避免文件覆盖
int i = fileName.lastIndexOf(“.”);
String suffix = fileName.substring(i);
fileName = fileName.substring(0, i) + System.currentTimeMillis() + suffix;
// 把文件按照日期进行分类
// 获取当前日期
String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now());
// 拼接fileName
fileName = datePath + “/” + fileName;
// 如果需要上传时设置存储类型与访问权限
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf(“.”))));
// 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream);
putObjectRequest.setMetadata(metadata);
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(putObjectRequest);
//文件访问路径
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);
URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);
// 关闭ossClient
ossClient.shutdown();
// 把上传到oss的路径返回
return url.toString();
}
/**
-
返回contentType
-
@param FileNameExtension
-
@return
*/
private static String getContentType(String FileNameExtension) {
if (FileNameExtension.equalsIgnoreCase(“.bmp”)) {
return “image/bmp”;
}
if (FileNameExtension.equalsIgnoreCase(“.gif”)) {
return “image/gif”;
}
if (FileNameExtension.equalsIgnoreCase(“.jpeg”) ||
FileNameExtension.equalsIgnoreCase(“.jpg”) ||
FileNameExtension.equalsIgnoreCase(“.png”)
) {
return “image/jpg”;
}
return “image/jpg”;
}
/**
-
列举 指定路径下所有的文件的文件名
-
如果要列出根路径下的所有文件,path= “”
-
@param path
-
@return
*/
public static List listFileName(String path) {
List res = new ArrayList<>();
// 构造ListObjectsRequest请求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 设置prefix参数来获取fun目录下的所有文件。
listObjectsRequest.setPrefix(path);
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 列出文件。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍历所有文件
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 关闭OSSClient。
ossClient.shutdown();
return res;
}
/**
- 列举文件下所有的文件url信息
*/
public static List listFileUrl(String path) {
List res = new ArrayList<>();
// 构造ListObjectsRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 设置prefix参数来获取fun目录下的所有文件。
listObjectsRequest.setPrefix(path);
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 列出文件。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍历所有文件。
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
//文件访问路径
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);
URL url = ossClient.generatePresignedUrl(bucketName, objectSummary.getKey(), expiration);
res.add(url.toString());
}
// 关闭OSSClient。
ossClient.shutdown();
return res;
}
/**
-
判断文件是否存在
-
@param objectName
-
@return
*/
public static boolean isFileExist(String objectName) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
boolean res = ossClient.doesObjectExist(bucketName, objectName);
return res;
}
/**
-
通过文件名下载文件
-
@param objectName 要下载的文件名
-
@param localFileName 本地要创建的文件名
*/
public static void downloadFile(String objectName, String localFileName) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
// 关闭OSSClient。
ossClient.shutdown();
}
/**
-
删除文件或目录
-
@param objectName
*/
public static void delelteFile(String objectName) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.deleteObject(bucketName, objectName);
ossClient.shutdown();
}
/**
-
批量删除文件或目录
-
@param keys
*/
public static void deleteFiles(List keys) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 删除文件。
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
java.util.List deletedObjects = deleteObjectsResult.getDeletedObjects();
ossClient.shutdown();
}
/**
-
创建文件夹
-
@param folder
-
@return
*/
public static String createFolder(String folder) {
// 文件夹名
final String keySuffixWithSlash = folder;
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 判断文件夹是否存在,不存在则创建
if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {
// 创建文件夹
ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
// 得到文件夹名
OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
String fileDir = object.getKey();
ossClient.shutdown();
return fileDir;
}
return keySuffixWithSlash;
}
}
注意:为了避免OSS链接出现 connection pool shutdown
错误,不要在类中创建了OSSClient对象 ,因为这样做的话所有方法共用此实例对象,在前端很短的时间内连续提交,造成异常错误。应该将OSSClient对象在方法中创建。
class AliOSSUtilTest {
@Test
void upload() throws FileNotFoundException {
//上传文件
String url = AliOSSUtil.upload(“E:\图片\510.jpg”, “/aa/bb/ba.jpg”);
System.out.println(url);
}
@Test
void listFileName() {
List res = AliOSSUtil.listFileName(“aa/”);
res.forEach(System.out::println);
}
@Test
void listFileUrl() {
List res = AliOSSUtil.listFileUrl(“aa/”);
res.forEach(System.out::println);
}
@Test
void isFileExist() {
boolean res = AliOSSUtil.isFileExist(“aa/bb/ab1637160001528.jpg”);
System.out.println(res);
}
@Test
void downloadFile() {
AliOSSUtil.downloadFile(“aa/bb/ab1637160001528.jpg”, “d:/aaawer.jpg”);
}
@Test
void delelteFile() {
AliOSSUtil.delelteFile(“aa/bb/ab1637160001528.jpg”);
}
@Test
void deleteFiles() {