前言:
现公司采用七牛作为OSS服务器存储视频资源,七牛直播文件上传在七牛中,但是只要是文件都往里面放,在这种情况下,公司决定对七牛视频文件进行整理,节约存储空间资源
思路:
考虑到上传上七牛的视频文件都是以切片的形式上传,即m3u8+TTS格式文件组合,而数据库中只保存mu38文件的地址,
直接过滤出无用的文件的话只能过滤出m3u8文件,tts文件无法删除,故在官方文档寻找到如下工具
https://developer.qiniu.com/kodo/tools/1302/qshell
所以呢,调用外部命令行工具即可实现
需求:
删除七牛上数据库未保存的用户上传的无用视频文件(但是近十天之内的不删除)
解决方案:
步骤一、提取七牛文件列表,用于筛选无用文件
public static CopyOnWriteArrayList<QiNiuEntity> getQiNiuFiles(String bucket, String prefix ) {
BucketManager bucketManager = getBucketManager();
//指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
String delimiter = ""; //没有缺省值则不填,列举数据,
//每次迭代的长度限制,最大1000,推荐值 1000
int limit = 1000;
//列举空间文件列表
BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit,
delimiter);
CopyOnWriteArrayList<QiNiuEntity> files=new CopyOnWriteArrayList<>();
while (fileListIterator.hasNext()) {
//处理获取的file list结果
FileInfo[] items = fileListIterator.next();
for (FileInfo item : items) {
QiNiuEntity qiNiuEntity =new QiNiuEntity();
qiNiuEntity.setKey(item.key);
String time= DateUtils.getStringTime(item.putTime);
qiNiuEntity.setPutTime(time);
// System.out.println(item.key);
qiNiuEntity.setMimeType(item.mimeType);
files.add(qiNiuEntity);
if(files.size()>998){ //七牛最大1000值失效,只能手动控制下了
return files;
}
}
}
return files;
}
步骤二、提取数据库中的m3u8路径,由于是JSON格式保存在数据库中,所以需要提取
步骤三、比较并过滤出无用的文件
步骤四、调用qshell删除无用文件
public R deleteFiles() {
//recordings //kaoji
CopyOnWriteArrayList<QiNiuEntity> qiNiuFiles = qiNiuFileService.getFile(bucketFile, "recordings");
//十天之内的文件过滤掉不删除
String nowTime = DateUtils.formatTime("yyyy-MM-dd HH:mm:ss", System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateTime1 = null;
try {
dateTime1 = sdf.parse(nowTime);
} catch (ParseException e) {
e.printStackTrace();
}
String[] fileNames = new String[1000]; //最大只能为一千
for (int i = 0; i < qiNiuFiles.size(); i++) {
Date dateTime2 = null;
try {
dateTime2 = sdf.parse(qiNiuFiles.get(i).getPutTime());
long difference = dateTime1.getTime() - dateTime2.getTime();
long days = difference / (1000 * 60 * 60 * 24);
/* String fileTime=qiNiuFiles.get(i).getPutTime();
if(days<10){ //相距十天之内的文件过滤不删除
System.out.println(qiNiuFiles.get(i).getPutTime());
System.out.println(qiNiuFiles.get(i).getKey());
}*/
if (qiNiuFiles.get(i).getIsOld() == 0 && days > 10) { //未放入数据库中的文件中中10天之内上传的文件不删除
fileNames[i] = qiNiuFiles.get(i).getKey();
}
} catch (ParseException e) {
e.printStackTrace();
}
if (i > 998) {
break;
}
}
List<String> tmp = new ArrayList<String>();
for (String str : fileNames) {
if (str != null && str.length() != 0) {
tmp.add(str);
}
}
fileNames = tmp.toArray(new String[0]);
Arrays.sort(fileNames);
//批量删除数据,该方法暂时不用,用来批量删除数据用的
// qiNiuFileService.deleteFiles(fileNames, bucketFile);
for (int i = 0; i < fileNames.length; i++) {
StringBuilder deleteFile =
new StringBuilder("qshell m3u8delete ").append(bucketFile).append(" ").append(fileNames[i]);
String deleteFiles = deleteFile.toString();
String netsString = exec(deleteFiles).toString();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("==========获得值=============");
logger.info("CMDEXCQINIU..." + netsString + "isGoodInfo");
}
return R.ok();
}
//步骤五、在docker中安装qshell,没有使用docker的同学可以直接在服务器上装一个qshell
转载请注明出处,掌声送给社会人
1万+

被折叠的 条评论
为什么被折叠?



