【经验】使用Java控制kiftd网盘服务器并实现定时导入文件功能 您所在的位置:网站首页 开源私有网盘怎么下载文件 【经验】使用Java控制kiftd网盘服务器并实现定时导入文件功能

【经验】使用Java控制kiftd网盘服务器并实现定时导入文件功能

2024-07-17 11:58| 来源: 网络整理| 查看: 265

问题起源

对于多数开发者而言,可能都希望能将自己的程序中定时产生一些重要文件(例如运行日志、爬虫结果、统计报表等)自动定时上传至一个程序内置的私有网络文件共享平台上,并在上传时按照上传日期或者其版本号命名。这样一来,就可以实现用户在任意位置进行访问和下载这些文件了——相比于远程登录到程序运行的计算机内再进行拷贝而言,如此设计当然要高效得多(只要用户有浏览器即可),操作过程也会更简单。

那么要如何才能实现这一功能呢?本文就来介绍一种通过Java程序配合kiftd开源网盘的方式,来实现上述功能(这里简单介绍一下kiftd:它是一款轻量化的开源网盘,能够用来在各个操作系统上搭建私有云盘或局域网网盘)。

注:本教程所有截图均为实际演示截图,且提供的代码均经过实际测试和检验,请放心阅读。

1,部署好kiftd并进行设置:

首先,我们需要先在本地安装好一份kiftd。安装过程十分简单:首先,前往kiftd的官网免费下载一份zip压缩包;之后,将其解压至硬盘中的任意位置(路径中最好不要有中文)。

在本示例中,我们将kiftd解压到 /Users/kohgylw/program/kiftd-test/ 路径下(后文中均使用该位置作为kiftd的路径)。

接下来,需要对kiftd进行一些配置。请双击解压目录中的jar程序启动kiftd【标号1】,并在设置窗口中【标号2】将其端口号设置为9000【标号3】(注意:该端口号可以随意取,但不能与自己运行的其他程序重复,例如自己运行的Tomcat如果使用了8080端口,那么kiftd就必须换成其它的端口号),如图所示:

现在kiftd的设置工作便已经完成了,也就能够正常使用了。

提示:对于无图形化界面的服务器操作系统及Linux系统而言,也可以通过编辑conf文件夹中的server.properties文件并修改port=8080一项的方式来设置端口,效果与上述方法相同。

2,使用自己的Java程序来开启kiftd网盘并访问

我们需要用自己的Java程序去控制kiftd的启动,以便定期向其中导入一些文件供用户访问和下载。

这里使用的方式便是使用Java自带的 java.lang.Process 对象实现该功能,它能够以独立的进程运行控制台/终端命令。我们先关闭kiftd,之后在自己的程序中使用Runtime类的exec方法开启kiftd,该kiftd将在一个单独的JVM中启动并运行(与我们自己的Java程序相互独立):

Process p = Runtime.getRuntime().exec("java -jar /Users/kohgylw/program/kiftd-test/kiftd-1.0.17-SNAPSHOT.jar -console");

注意,上述命令中的jar程序所在路径要自行替换,且在Windows系统下应该使用“\\”分割,Linux和Mac OS X下则是“/”(本示例中的情况)。执行完上述代码后,kiftd将以“命令模式”启动并等待进步一的操作指令(关于该命令的具体说明请参见kiftd官方提供的《kiftd说明文档》)。

此时,kiftd已经准备就绪,但还未启动kiftd的服务器。为了能够开始访问,我们需要【继续使用】该Process对象来向kiftd进程发送“-start”命令,用以开启kiftd的服务器。示例代码如下:

// 向该进程写入命令,与在终端中操作一致 PrintWriter writer = new PrintWriter(p.getOutputStream()); // 启动服务器,此时会开启kiftd服务器 writer.println("-start"); writer.flush();

上述命令在执行过程中会阻塞线程,直到kiftd服务器开启成功。命令执行完毕后,你就可以打开Chrome或FireFox浏览器访问kiftd的主页了。为了测试,可以在浏览器中输入http://{自己的IP地址}:{端口号}/(例如http://127.0.0.1:9000/),如果kiftd启动成功的话,你会在浏览器中看到下图所示的效果(本人的kiftd中已经存储了一些文件,如果你的kiftd是新安装的,那么文件列表也应该是空的。默认的管理员账户是admin,密码000000):

3,使用Java程序向kiftd中定时存入文件

现在,回到我们最初的目的上——我们希望能够通过程序控制,自动将一些文件上传到kiftd中供用户下载。为了模拟这一需求,现在在 /Users/kohgylw/program/ 路径下建立一个文件夹,并将其命名为 uploads ,如图所示:

假设该文件夹将会不定期地生成一些文件在其中,那么我们就希望能够通过程序来控制任何存入该文件夹的文件都能自动上传至kiftd的ROOT路径下。

为了实现这一效果,我们继续使用上面得到的PrintWriter对象向kiftd线程发送“-files”指令,进入到kiftd的文件管理模式:

// 进入命令模式中的文件管理功能 writer.println("-files"); writer.flush();

在该模式下,kiftd将接收文件处理指令,例如我们需要用到的导入指令。“导入指令”可以实现将本地文件(或文件夹)导入至kiftd中(初始为/ROOT/根路径,可以使用cd命令进入其他位置),其命令格式为:

import {要导入的本地文件(必须使用完整路径)}

 接下来,我们为上文中创建的uploads文件夹添加一个路径监听器来监听其中的文件增加事件,这里使用了JDK 1.7中提供的WatchService工具类,该类能够监听uploads文件夹内的文件创建事件(无论是新建文件还是将其他文件拷贝到该文件夹内,都统一算作文件创建事件),示例代码如下:

//开启一个独立线程监听这个文件夹内的文件创建 Thread t = new Thread(() -> { while (true) { try { //通过监听路径获取一个Path对象 Path path = new File("/Users/kohgylw/program/uploads/").toPath(); //由文件系统得到一个监听服务 WatchService ws = path.getFileSystem().newWatchService(); //声明监听文件创建事件(这里也可以监听文件夹),每个监听服务只能监听一次动作,因此需要循环监听 path.register(ws, StandardWatchEventKinds.ENTRY_CREATE); //开始监听并得到结果,当指定事件发生时,该方法将放行并继续执行后续过程 WatchKey wk = ws.take(); //得到事件列表 List> es = wk.pollEvents(); for (WatchEvent we : es) { // 得到相应的文件创建事件 if (we.kind() == StandardWatchEventKinds.ENTRY_CREATE) { // 得到触发该事件的文件名称 String newfile = we.context().toString(); // 向kiftd发送导入命令来导入该文件: writer.println("import /Users/kohgylw/program/uploads/" + newfile); writer.flush(); } } } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }); t.start(); //控制kiftd关闭,首先需要发送exit指令退出文件管理模式 // writer.println("exit"); // writer.flush(); //再发送-exit指令关闭整个kiftd // writer.println("-exit"); // writer.flush(); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } //用于打印kiftd产生的反馈信息,仅用于调试,实际使用中可以不调用 public static void print(Process p) { Thread t = new Thread(() -> { BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; try { while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }); t.start(); } }

 

如果该文章能够帮助到您,欢迎分享!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有