在上篇文章中,我们提到可以将直播服务器中的文件上传到OSS中,对拉流(播放)进行加速,本文主要介绍使用java来完成文件夹增删改的监控以及OSS的上传操作。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- 阿里云oss sdk-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
此处使用线程来进行上传操作。
package com.krs.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import java.io.File;
/**
* 创建OSS上传线程
*/
public class OssFileUploadThread implements Runnable {
String name;
String filePath;
public OssFileUploadThread(String name){
this.name = name;
}
public void setValue(String filePath) {
this.filePath = filePath;
}
public void run() {
System.out.println("上传文件到OSS:"+filePath);
//获取文件名称,在OSS中文件重名时进行覆盖
String[] fileNames = filePath.split("/");
String objectName = fileNames[fileNames.length-1];
// 此处为华北2(北京)的Region,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "<yourAccessKeyID>";
String accessKeySecret = "<yourAccessKeySecret>";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucket>", objectName, new File(filePath));
// 上传文件。
ossClient.putObject(putObjectRequest);
// 关闭OSSClient。
ossClient.shutdown();
}
}
package com.krs.utils;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
/**
* 文件变化监听器
*
* 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
* 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
* 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
*
*
*/
public class FileListener extends FileAlterationListenerAdaptor {
/**
* 文件创建执行
*/
public void onFileCreate(File file) {
System.out.println("[新建]:" + file.getAbsolutePath());
//使用构造器传值
OssFileUploadThread testThread1 = new OssFileUploadThread("file create thread ");
//使用set方法进行传值
testThread1.setValue( file.getAbsolutePath());
//启动线程
Thread thread1 = new Thread(testThread1);
thread1.start();
}
/**
* 文件创建修改
*/
public void onFileChange(File file) {
System.out.println("[修改]:" + file.getAbsolutePath());
//使用构造器传值
OssFileUploadThread testThread1 = new OssFileUploadThread("file change thread ");
//使用set方法进行传值
testThread1.setValue( file.getAbsolutePath());
//启动线程
Thread thread1 = new Thread(testThread1);
thread1.start();
}
/**
* 文件删除
*/
public void onFileDelete(File file) {
System.out.println("[删除]:" + file.getAbsolutePath());
}
/**
* 目录创建
*/
public void onDirectoryCreate(File directory) {
System.out.println("[新建]:" + directory.getAbsolutePath());
}
/**
* 目录修改
*/
public void onDirectoryChange(File directory) {
System.out.println("[修改]:" + directory.getAbsolutePath());
}
/**
* 目录删除
*/
public void onDirectoryDelete(File directory) {
System.out.println("[删除]:" + directory.getAbsolutePath());
}
public void onStart(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStart(observer);
}
public void onStop(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStop(observer);
}
}
package com.krs.controller;
import com.krs.utils.FileListener;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
@RestController
@RequestMapping("/file")
public class FieUtilController {
/**
* 监控文件夹中文件(夹)的修改
* @param rootDir 监听路径
* @param interval 监听轮询时间(毫秒)
* @throws Exception
*/
@GetMapping("listen")
public void listen(@RequestParam(defaultValue = "",required = false)String rootDir,
@RequestParam(defaultValue = "8000",required = false)Long interval
) throws Exception{
// 创建过滤器
IOFileFilter directories = FileFilterUtils.and(
FileFilterUtils.directoryFileFilter(),
HiddenFileFilter.VISIBLE);
IOFileFilter files = FileFilterUtils.and(
FileFilterUtils.fileFileFilter()
);
IOFileFilter filter = FileFilterUtils.or(directories, files);
// 使用过滤器
FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
//不使用过滤器
//FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
observer.addListener(new FileListener());
//创建文件变化监听器
FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
// 开始监控
monitor.start();
}
}
启动监听时直接请求连接即可,例如:IP为192.168.1.123,监听目录为:/www/hls,轮询时间为8s。
则地址为:http://192.169.1.123:8080/file/listen?rootDir=/www/hls&interval=8000
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}