今天的工作是迁移阿里云oss中的数据,由于前缀名的问题,如果要修改所有数据库中多个表中的已保存的url的话太繁琐,bucket的名字是全网唯一的,先在新服务器上随便创建一个buctket,将老服务器中的数据迁移过去后只有删除老服务器中的bucket才能在新服务器上创建同名的bucket,参照官网给的api文档,稍微修改下就实现下面的删除功能啦~(ps:删除bucket后阿里云会有一段时间的延迟,大概10分钟左右才能新创建同名的bucket哦,提交工单问了售后他也不大清楚,只能自己踩坑踩坑…)
我的项目是maven管理的,使用maven依赖:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun.oss.version}</version>
</dependency>
OSSUtils工具类:
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
public class OSSUtil {
/**
*
* @Title: getOSSClient
* @Description: 获取oss客户端
* @return OSSClient oss客户端
* @throws
*/
public static OSSClient getOSSClient() {
//公司新服务器
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "xxxxxxxxxxxx";
String accessKeySecret = "xxxxxxxxxxxxxxxxxxxxx";
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
return ossClient;
}
/**
*
* @Title: uploadByNetworkStream
* @Description: 通过网络流上传文件
* @param ossClient oss客户端
* @param url URL
* @param bucketName bucket名称
* @param objectName 上传文件目录和(包括文件名)例如“test/index.html”
* @return void 返回类型
* @throws
*/
public static void uploadByNetworkStream(OSSClient ossClient, URL url, String bucketName, String objectName) {
try {
InputStream inputStream = url.openStream();
ossClient.putObject(bucketName, objectName, inputStream);
ossClient.shutdown();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @Title: uploadByInputStream
* @Description: 通过输入流上传文件
* @param ossClient oss客户端
* @param inputStream 输入流
* @param bucketName bucket名称
* @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
* @return void 返回类型
* @throws
*/
public static void uploadByInputStream(OSSClient ossClient, InputStream inputStream, String bucketName,
String objectName) {
try {
ossClient.putObject(bucketName, objectName, inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @Title: uploadByFile
* @Description: 通过file上传文件
* @param ossClient oss客户端
* @param file 上传的文件
* @param bucketName bucket名称
* @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
* @return void 返回类型
* @throws
*/
public static void uploadByFile(OSSClient ossClient, File file, String bucketName, String objectName) {
try {
ossClient.putObject(bucketName, objectName, file);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @Title: deleteFile
* @Description: 根据key删除oss服务器上的文件
* @param ossClient oss客户端
* @param bucketName bucket名称
* @param key 文件路径/名称,例如“test/a.txt”
* @return void 返回类型
* @throws
*/
public static void deleteFile(OSSClient ossClient, String bucketName, String key) {
ossClient.deleteObject(bucketName, key);
}
/**
*
* @Title: getInputStreamByOSS
* @Description:根据key获取服务器上的文件的输入流
* @param ossClient oss客户端
* @param bucketName bucket名称
* @param key 文件路径和名称
* @return InputStream 文件输入流
* @throws
*/
public static InputStream getInputStreamByOSS(OSSClient ossClient, String bucketName, String key) {
InputStream content = null;
try {
OSSObject ossObj = ossClient.getObject(bucketName, key);
content = ossObj.getObjectContent();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/**
*
* @Title: queryAllObject
* @Description: 查询某个bucket里面的所有文件
* @param ossClient oss客户端
* @param bucketName bucket名称
* @return List<String> 文件路径和大小集合
* @throws
*/
public static List<String> queryAllObject(OSSClient ossClient, String bucketName) {
List<String> results = new ArrayList<String>();
try {
// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
ObjectListing objectListing = ossClient.listObjects(bucketName);
// objectListing.getObjectSummaries获取所有文件的描述信息。
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
results.add(" - " + objectSummary.getKey() + " " + "(size = " + objectSummary.getSize() + ")");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return results;
}
}
controller逻辑代码:
import com.aliyun.oss.OSS;
import io.renren.common.utils.OSSUtils;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
public class delAliyunBucketObject {
public static int count ;
public static void main(String[] args) {
try {
while (delBucketObject()){
System.out.println("共删除文件数量::::::::"+count);
}
}catch (NullPointerException n){
System.out.println("出现空指针了!!!!!!!!!!!!");
n.printStackTrace();
}
}
public static boolean delBucketObject(){
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "xxxxxxxxxxxxx";
String accessKeySecret = "xxxxxxxxxxxxxxxxxxxxx";
String bucketName = "xxxxx";
// 创建OSSClient实例。(endpoint, accessKeyId, accessKeySecret)
OSS ossClient = OSSUtils.getOSSClient();
// 构造ListObjectsRequest请求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 列出文件。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
List<OSSObjectSummary> list = listing.getObjectSummaries();
List<String> keysList = new ArrayList<>();
// 遍历所有commonPrefix。
System.out.println("CommonPrefixes:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
// 遍历所有文件。
System.out.println("Objects:");
if(list.size()>0){
for (OSSObjectSummary objectSummary : list) {
//删除
ossClient.deleteObject(bucketName,objectSummary.getKey());
count++;
}
}else{
System.out.println("删除没了");
return false;
}
// 关闭OSSClient。
ossClient.shutdown();
return true;
}
}