From 7ec40106f17dfd79e1a9ca81ce2ce76a041f62b9 Mon Sep 17 00:00:00 2001 From: Eg <1711788888@qq.com> Date: Sun, 29 Aug 2021 18:02:09 +0800 Subject: [PATCH] Debug --- .idea/.gitignore | 8 + .idea/compiler.xml | 13 + .idea/encodings.xml | 7 + .idea/inspectionProfiles/Project_Default.xml | 97 ++++ .idea/jarRepositories.xml | 25 + .idea/misc.xml | 14 + .idea/smartfox_info.xml | 6 + .idea/vcs.xml | 6 + back_config.setting | 5 + pom.xml | 88 ++++ src/META-INF/MANIFEST.MF | 3 + src/main/java/com/eg/www/AliYunPan.java | 326 +++++++++++++ src/main/java/com/eg/www/App.java | 59 +++ .../com/eg/www/common/CommonConstants.java | 86 ++++ src/main/java/com/eg/www/common/CronTask.java | 39 ++ .../java/com/eg/www/common/MyConsole.java | 26 + .../eg/www/common/utils/AliYunPanUtil.java | 459 ++++++++++++++++++ .../com/eg/www/common/utils/FileUtil.java | 178 +++++++ .../com/eg/www/common/utils/OkHttpUtil.java | 127 +++++ .../com/eg/www/common/utils/getToken.java | 10 + src/main/resources/config/cron.setting | 13 + src/main/resources/images/logo.png | Bin 0 -> 14718 bytes target/classes/com/eg/www/AliYunPan$1.class | Bin 0 -> 855 bytes target/classes/com/eg/www/AliYunPan$2.class | Bin 0 -> 1049 bytes target/classes/com/eg/www/AliYunPan.class | Bin 0 -> 10554 bytes target/classes/com/eg/www/App.class | Bin 0 -> 685 bytes .../com/eg/www/common/CommonConstants.class | Bin 0 -> 3563 bytes .../classes/com/eg/www/common/CronTask.class | Bin 0 -> 1997 bytes .../classes/com/eg/www/common/MyConsole.class | Bin 0 -> 1193 bytes .../eg/www/common/utils/AliYunPanUtil$1.class | Bin 0 -> 2615 bytes .../eg/www/common/utils/AliYunPanUtil.class | Bin 0 -> 13796 bytes .../com/eg/www/common/utils/FileUtil.class | Bin 0 -> 4898 bytes .../com/eg/www/common/utils/OkHttpUtil.class | Bin 0 -> 4642 bytes target/classes/config/cron.setting | 13 + target/classes/images/logo.png | Bin 0 -> 14718 bytes uploadLog.txt | 3 + 36 files changed, 1611 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/smartfox_info.xml create mode 100644 .idea/vcs.xml create mode 100644 back_config.setting create mode 100644 pom.xml create mode 100644 src/META-INF/MANIFEST.MF create mode 100644 src/main/java/com/eg/www/AliYunPan.java create mode 100644 src/main/java/com/eg/www/App.java create mode 100644 src/main/java/com/eg/www/common/CommonConstants.java create mode 100644 src/main/java/com/eg/www/common/CronTask.java create mode 100644 src/main/java/com/eg/www/common/MyConsole.java create mode 100644 src/main/java/com/eg/www/common/utils/AliYunPanUtil.java create mode 100644 src/main/java/com/eg/www/common/utils/FileUtil.java create mode 100644 src/main/java/com/eg/www/common/utils/OkHttpUtil.java create mode 100644 src/main/java/com/eg/www/common/utils/getToken.java create mode 100644 src/main/resources/config/cron.setting create mode 100644 src/main/resources/images/logo.png create mode 100644 target/classes/com/eg/www/AliYunPan$1.class create mode 100644 target/classes/com/eg/www/AliYunPan$2.class create mode 100644 target/classes/com/eg/www/AliYunPan.class create mode 100644 target/classes/com/eg/www/App.class create mode 100644 target/classes/com/eg/www/common/CommonConstants.class create mode 100644 target/classes/com/eg/www/common/CronTask.class create mode 100644 target/classes/com/eg/www/common/MyConsole.class create mode 100644 target/classes/com/eg/www/common/utils/AliYunPanUtil$1.class create mode 100644 target/classes/com/eg/www/common/utils/AliYunPanUtil.class create mode 100644 target/classes/com/eg/www/common/utils/FileUtil.class create mode 100644 target/classes/com/eg/www/common/utils/OkHttpUtil.class create mode 100644 target/classes/config/cron.setting create mode 100644 target/classes/images/logo.png create mode 100644 uploadLog.txt diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..6909e56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..fa99c1b --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,97 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..7f10861 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..132404b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/smartfox_info.xml b/.idea/smartfox_info.xml new file mode 100644 index 0000000..1c2584f --- /dev/null +++ b/.idea/smartfox_info.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/back_config.setting b/back_config.setting new file mode 100644 index 0000000..76a9bd3 --- /dev/null +++ b/back_config.setting @@ -0,0 +1,5 @@ +[] +tokenText = 77190dd0a59a45b0883650647b85522d +pathText = C:\Users\Administrator\Desktop\HKBTest +folderText = backtest +backType = 0 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8c564d9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + com.eg + aliyunpan-autobackup + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.11 + test + + + + + com.squareup.okhttp3 + okhttp + 4.9.1 + + + + + cn.hutool + hutool-all + 5.6.5 + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + + \ No newline at end of file diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..b5e1fa2 --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: com.eg.www.App + diff --git a/src/main/java/com/eg/www/AliYunPan.java b/src/main/java/com/eg/www/AliYunPan.java new file mode 100644 index 0000000..f7a9096 --- /dev/null +++ b/src/main/java/com/eg/www/AliYunPan.java @@ -0,0 +1,326 @@ +package com.eg.www; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.setting.Setting; +import com.eg.www.common.CommonConstants; +import com.eg.www.common.utils.AliYunPanUtil; +import com.eg.www.common.utils.FileUtil; + +import javax.swing.*; +import javax.swing.plaf.FontUIResource; +import java.awt.*; +import java.awt.event.*; +import java.util.Enumeration; + +/** + * Description: GUI + * Author: Eg + * Date: 2021/08/29 + */ +public class AliYunPan extends JFrame implements ActionListener { + + private static final int obj_left = 100;//左边距 + private static final int text_width = 400;//文本框框 + private static final int text_high = 30;//文本框高 + private static final int title_left = 10;//标题左边距 + private static final int title_width = 166;//标题宽 + private static final int title_high = 25;//标题高 + private static final int radio_top = 150;//标题高 + private static final int radio_width = 100;//标题高 + private static final int radio_high = 25;//标题高 + + //阿里云工具类 + private AliYunPanUtil aliYunPanUtil=new AliYunPanUtil(); + // 日志界面 + JScrollPane consolePane = CommonConstants.consolePane; + JScrollBar scrollBar = CommonConstants.scrollBar; + //Token文本框 + JTextField tokenText = CommonConstants.tokenText; + // 备份目录 + private JTextField pathText; + // 目录名称 + private JTextField folderText; + //选择文件夹按钮 + private JButton selectBtn; + //选择文件夹 + private JFileChooser selectPathChooser = new JFileChooser(); + + // 迭代一单选框 + private JRadioButton puTongRadio; + // 迭代二单选框 + private JRadioButton fenLeiRadio; + + // 开始备份 + private JButton startBackup = CommonConstants.startBackup; + // 暂停备份 + private JButton pauseBackup; + + //判断系统是否有托盘 + static SystemTray tray = SystemTray.getSystemTray(); + //托盘图标 + private static TrayIcon trayIcon = null; + //配置文件 + Setting setting =CommonConstants.setting; + + public AliYunPan(){ + //GUI默认配置 + initConfig(); + //初始化UI + initUi(); + this.setVisible(true); + //初始化变量 + CommonConstants.PATH = setting.getStr("pathText"); + CommonConstants.REFRESH_TOKEN = setting.getStr("tokenText"); + CommonConstants.BACK_NAME = setting.getStr("folderText"); + if (StrUtil.isNotEmpty(setting.getStr("backType"))){ + CommonConstants.BACK_TYPE = Integer.parseInt(setting.getStr("backType")); + } + //开启目录检测 + aliYunPanUtil.monitorFolder(); + } + + /** + * 程序默认配置 + */ + private void initConfig() { + // 设置界面使用字体 + FontUIResource fontUIResource = new FontUIResource(new Font("宋体", Font.PLAIN, 13)); + for (Enumeration keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof FontUIResource) { + UIManager.put(key, fontUIResource); + } + } + //设置显示窗口标题 + setTitle("备份助手"); + //设置标题栏的图标 + this.setIconImage(new ImageIcon(getClass().getResource("/images/logo.png")).getImage()); + //设置窗口显示尺寸 + setSize(800,600); + //窗口是否可以关闭 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + //默认居中显示 + setLocationRelativeTo(null); + //禁止改变窗口大小 + this.setResizable(false); + + // 窗口最小化事件 + this.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + } + + public void windowIconified(WindowEvent e) { + setVisible(false); + miniTray(); + } + + }); + } + + public void initUi() { + // 初始化控件 + Container container = getContentPane(); + container.setLayout(null); + + /** + * 左侧标题 + */ + JLabel pathTitle = new JLabel("选择目录"); + pathText = new JTextField(); + JLabel tokenTitle = new JLabel("阿里云Token"); + //tokenText = new JTextField(); + JLabel folderTitle = new JLabel("备份目录名称"); + folderText = new JTextField(); + JLabel backTitle = new JLabel("备份模式"); + backTitle.setBounds(title_left, 150, title_width, title_high); + container.add(backTitle); + // 路径选择区域 + JPanel selectPanle = new JPanel(); + selectPanle.setLayout(null); + + //选择目录框 + pathTitle.setBounds(title_left, 20, title_width, title_high); + container.add(pathTitle); + pathText.setText(setting.getStr("pathText")); + pathText.setBounds(obj_left, 20, text_width, text_high); + container.add(pathText); + + //token框 + tokenTitle.setBounds(title_left, 60, title_width, title_high); + container.add(tokenTitle); + tokenText.setText(setting.getStr("tokenText")); + tokenText.setBounds(obj_left, 60, text_width, text_high); + container.add(tokenText); + + //目录名称框 + folderTitle.setBounds(title_left, 100, title_width, title_high); + container.add(folderTitle); + folderText.setText(setting.getStr("folderText")); + folderText.setBounds(obj_left, 100, text_width, text_high); + container.add(folderText); + + //选择文件按钮 + selectBtn = new JButton("选择..."); + selectBtn.setBounds(501, 22, 90, 25); + selectBtn.addActionListener(this); + container.add(selectBtn); + + + //读取设置中选中的模式 + String type = setting.getStr("backType"); + boolean pt_checked=false; + boolean fl_checked=false; + if (ObjectUtil.isNotNull(type)){ + if (type.equals("0")){ + pt_checked=true; + }else if (type.equals("1")){ + fl_checked=true; + } + }else { + pt_checked=true; + } + //模式选择 + puTongRadio = new JRadioButton("普通备份",pt_checked); + puTongRadio.setBounds(100, radio_top, radio_width, radio_high); + puTongRadio.setBackground(container.getBackground()); + container.add(puTongRadio); + fenLeiRadio = new JRadioButton("分类备份",fl_checked); + fenLeiRadio.setBounds(250, radio_top, radio_width, radio_high); + fenLeiRadio.setBackground(container.getBackground()); + container.add(fenLeiRadio); + //设置为单选 + ButtonGroup typeGroup = new ButtonGroup(); + typeGroup.add(puTongRadio); + typeGroup.add(fenLeiRadio); + + + //startBackup = new JButton("开始备份"); + startBackup.setFont(new Font("宋体", Font.PLAIN, 13)); + startBackup.setBounds(100, 195, 100, 30); + startBackup.addActionListener(this); + container.add(startBackup); + pauseBackup = new JButton("暂停备份"); + pauseBackup.setBounds(250, 195, 100, 30); + pauseBackup.addActionListener(this); + container.add(pauseBackup); + //日志面板 + consolePane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); + scrollBar.setSize(100,100); + consolePane.setBounds(0, 240, 800, 348); + container.add(consolePane); + } + + /** + * 事件处理器 + * @param e + */ + @Override + public void actionPerformed(ActionEvent e) { + //选择文件夹 + if (e.getSource() == selectBtn) { + selectPathChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int intRetVal = selectPathChooser.showOpenDialog(this); + if (intRetVal == JFileChooser.APPROVE_OPTION) { + pathText.setText(selectPathChooser.getSelectedFile().getPath()); + } + }else { + if (!checkText()){//验证 + return; + } + + //开始按钮 + if (e.getSource() == startBackup) { + startBackup.setEnabled(false); + startBackup.setText("正在备份"); + CommonConstants.CLEAN_CONSOLE=0; + //获取用户输入的token + CommonConstants.REFRESH_TOKEN=tokenText.getText(); + setting.set("tokenText",CommonConstants.REFRESH_TOKEN); + //获取用户输入的目录 + CommonConstants.PATH=pathText.getText(); + setting.set("pathText",CommonConstants.PATH); + //获取用户输入的目录名称 + CommonConstants.BACK_NAME=folderText.getText(); + setting.set("folderText",CommonConstants.BACK_NAME); + //获取上传模式 + CommonConstants.BACK_TYPE = puTongRadio.isSelected() ? 0 : 1; + setting.set("backType",CommonConstants.BACK_TYPE+""); + //输出模式 + CommonConstants.addConsole("备份模式:"+(puTongRadio.isSelected() ? "普通模式" : "分类模式")); + setting.store(CommonConstants.CONFIG_PATH); + //执行上传文件操作 + try { + Thread backup = new Thread(() -> aliYunPanUtil.startBackup()); + backup.start(); + } catch (Exception exc) { + CommonConstants.addConsole("遇到异常情况:"+exc.toString()); + } + } + + //暂停按钮 + if (e.getSource() == pauseBackup) { + JOptionPane.showMessageDialog(null, "此功能正在开发中...", "提示", JOptionPane.INFORMATION_MESSAGE); + } + } + } + + /** + * 验证文本框输入 + */ + public Boolean checkText(){ + if (StrUtil.isEmpty(pathText.getText())){ + JOptionPane.showMessageDialog(null, "您没有选择需要备份的目录", "错误", JOptionPane.ERROR_MESSAGE); + return false; + } + if (StrUtil.isEmpty(tokenText.getText())){ + JOptionPane.showMessageDialog(null, "您没有输入阿里云token", "错误", JOptionPane.ERROR_MESSAGE); + return false; + } + if (StrUtil.isEmpty(folderText.getText())){ + JOptionPane.showMessageDialog(null, "您没有输入需要备份到阿里云的目录", "错误", JOptionPane.ERROR_MESSAGE); + return false; + } + if (tokenText.getText().length()!=32){ + JOptionPane.showMessageDialog(null, "您输入的token不正确", "错误", JOptionPane.ERROR_MESSAGE); + return false; + } + if (!FileUtil.isDirectory(pathText.getText())){ + JOptionPane.showMessageDialog(null, "请选择正确目录", "错误", JOptionPane.ERROR_MESSAGE); + return false; + } + return true; + } + + //窗口最小化到任务栏托盘 + private void miniTray() { + ImageIcon trayImg = new ImageIcon(JFrame.class.getClass().getResource("/images/logo.png"));//托盘图标 + trayIcon = new TrayIcon(trayImg.getImage(), "备份助手"); + trayIcon.setImageAutoSize(true); + + //鼠标点击事件处理器 + trayIcon.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + //if (e.getClickCount() ==2 ) { + // 鼠标点击一次打开软件 + if (e.getClickCount() == 1) { + // 移去托盘图标 + tray.remove(trayIcon); + setVisible(true); + //还原窗口 + setExtendedState(JFrame.NORMAL); + toFront(); + } + } + }); + + try { + tray.add(trayIcon); + } catch (Exception e) { + System.out.println("发生异常:"+e); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/eg/www/App.java b/src/main/java/com/eg/www/App.java new file mode 100644 index 0000000..865020d --- /dev/null +++ b/src/main/java/com/eg/www/App.java @@ -0,0 +1,59 @@ +package com.eg.www; + +import cn.hutool.cron.CronUtil; + +/** + * 微信备份程序 + * + */ +public class App { + public static void main( String[] args ) { + //加载UI + new AliYunPan(); + //开启定时 + CronUtil.start(); + //支持秒级别定时任务 + CronUtil.setMatchSecond(true); + + + + //获取用户输入的token + /*CommonConstants.REFRESH_TOKEN="ec06dae699d14c8e87e55372d92f4664"; + //获取用户输入的目录 + CommonConstants.PATH="F:\\用户目录\\文档\\WeChat Files\\wxid_3wc96wg6zgf022\\FileStorage\\File\\2021-05"; + //获取用户输入的目录名称 + CommonConstants.BACK_NAME="测试2"; + //获取上传模式 + CommonConstants.BACK_TYPE = 1; + AliYunPanUtil aliYunPanUtil=new AliYunPanUtil(); + try { + aliYunPanUtil.startBackup(); + } catch (Exception e) { + System.out.println("遇到异常情况:"+e.toString()); + }*/ + + /*AliYunPanUtil.getAliYunPanInfo();//登录阿里云 + String wxFileId=AliYunPanUtil.getFileId(CommonConstants.ROOT, "公司-微信备份");//备份目录ID + List folderList = FileUtil.fileFolderList(CommonConstants.PATH,FileUtil.FOLDER); + for (String folderName : folderList) { + System.out.println("folder:"+folderName); + String path = CommonConstants.PATH + FileUtil.FILE_SEPARATOR + folderName;//路径 + List fileList = FileUtil.fileFolderList(path,FileUtil.FILE);//本地文件夹下文件 + for (String filePath : fileList) { + Map map = FileUtil.getFileInfo(filePath); + String type = map.get("type").toString(); + String typeFileId=AliYunPanUtil.getFileId(wxFileId,type);//微信备份-类型 + String dateFileId=AliYunPanUtil.getFileId(typeFileId,folderName);//微信备份-类型-日期 + AliYunPanUtil.doUploadFile(dateFileId,map); + } + String folderFileId = AliYunPanUtil.getFileId(wxFileId, "文件夹");//微信备份-文件夹 + String dateFileId = AliYunPanUtil.getFileId(folderFileId, folderName);//微信备份-文件夹-日期 + AliYunPanUtil.scanFolders(path,dateFileId,false); + } + System.out.println("ok");*/ + } + + public static void Test(){ + System.out.println(111); + } +} diff --git a/src/main/java/com/eg/www/common/CommonConstants.java b/src/main/java/com/eg/www/common/CommonConstants.java new file mode 100644 index 0000000..cd79eb6 --- /dev/null +++ b/src/main/java/com/eg/www/common/CommonConstants.java @@ -0,0 +1,86 @@ +package com.eg.www.common; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.file.FileReader; +import cn.hutool.core.io.file.FileWriter; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.setting.Setting; +import com.eg.www.common.utils.FileUtil; + +import javax.swing.*; +import java.io.File; + +/** + * Description: 公共变量 + * Author: Eg + * Date: 2021/08/29 + */ +public class CommonConstants { + + //日志面板 + public static MyConsole console = new MyConsole(); + public static JScrollPane consolePane = new JScrollPane(console); + public static JScrollBar scrollBar = consolePane.getVerticalScrollBar(); + // Token文本框 + public static JTextField tokenText = new JTextField(); + //开始备份按钮 + public static JButton startBackup = new JButton("开始备份"); + //当前路径 + public static String SYSTEM_PATH = System.getProperty("user.dir") + File.separator; + //配置文件路径 + public static String CONFIG_PATH = SYSTEM_PATH + "back_config.setting"; + //配置文件 + public static Setting setting = new Setting(FileUtil.touch(CONFIG_PATH).getPath(), true); + //上传文件日志 + public static String UPLOAD_LOG = SYSTEM_PATH + "uploadLog.txt"; + //写入日志 + public static FileWriter writerLog = FileWriter.create(FileUtil.touch(UPLOAD_LOG), CharsetUtil.CHARSET_UTF_8); + //读日志 + public static FileReader readerLog = new FileReader(UPLOAD_LOG); + //获取token + public final static String TOKEN_URL="https://websv.aliyundrive.com/token/refresh"; + //文件列表 + public final static String FILE_LIST_URL="https://api.aliyundrive.com/v2/file/list"; + //文件上传 + public final static String CREATE_FILE_URL="https://api.aliyundrive.com/v2/file/create"; + //完成上传 + public final static String COMPLETE_FILE_URL="https://api.aliyundrive.com/v2/file/complete"; + //删除文件 + public final static String DELETE_FILE_URL="https://api.aliyundrive.com/v2/recyclebin/trash"; + public static String FILE_ID=""; + //refresh_token + public static String REFRESH_TOKEN=""; + //Token + public static String TOKEN=""; + //driveId + public static String DriveId=""; + //根目录 + public final static String ROOT="root"; + //上传目录 + public static String PATH=""; + //备份目录名称 + public static String BACK_NAME=""; + //备份目录名称 + public static int BACK_TYPE=0;//0是普通备份 1是分类备份 + //输出日志模式 0是覆盖 1追加 + public static int CLEAN_CONSOLE=0; + //备份状态 + public static boolean BACK_STATE = false; + + /** + * 添加控制台日志 + * @param text + */ + public static void addConsole(String text){ + if (CLEAN_CONSOLE==0){ + console.setText("开始运行"+"\n"); + }else { + console.append("["+DateUtil.now()+"] "+text+"\n"); + console.paintImmediately(console.getBounds()); + scrollBar.setValue(scrollBar.getMaximum()); + } + } + + +} diff --git a/src/main/java/com/eg/www/common/CronTask.java b/src/main/java/com/eg/www/common/CronTask.java new file mode 100644 index 0000000..3abf983 --- /dev/null +++ b/src/main/java/com/eg/www/common/CronTask.java @@ -0,0 +1,39 @@ +package com.eg.www.common; + +import cn.hutool.core.util.StrUtil; +import com.eg.www.common.utils.AliYunPanUtil; + +/** + * Description: 定时任务类 + * Author: Eg + * Date: 2021/08/29 + */ +public class CronTask { + + //阿里云工具类 + private AliYunPanUtil aliYunPanUtil=new AliYunPanUtil(); + + /** + * 更新阿里云盘token + */ + public void updateALiYunPanToken(){ + if (StrUtil.isNotEmpty(CommonConstants.REFRESH_TOKEN)){ + CommonConstants.addConsole("定时更新阿里云Token"); + aliYunPanUtil.getAliYunPanInfo(); + } + } + + /** + * 定时备份文件 + */ + public void backFileList(){ + try { + //执行上传文件操作 + Thread backup = new Thread(() -> aliYunPanUtil.startBackup()); + backup.start(); + } catch (Exception e) { + CommonConstants.addConsole("遇到异常情况:"+e.toString()); + } + } + +} diff --git a/src/main/java/com/eg/www/common/MyConsole.java b/src/main/java/com/eg/www/common/MyConsole.java new file mode 100644 index 0000000..c138a7b --- /dev/null +++ b/src/main/java/com/eg/www/common/MyConsole.java @@ -0,0 +1,26 @@ +package com.eg.www.common; + +import javax.swing.*; +import java.awt.*; + +/** + * Description: 模拟控制台类 + * Author: Eg + * Date: 2021/08/29 + */ +public class MyConsole extends JTextArea { + public MyConsole() { + String info="温馨提示:备份目录名称是要备份到阿里云盘那个目录下(不存在则自动创建)\n"; + info+="普通备份:会按本地目录结构上传文件\n"; + info+="分类备份:会将本地文件按文档、压缩包、软件、音乐、图片、视频等分类上传\n"; + info+="运行日志...\n"; + this.setText(info); + this.setForeground(Color.white); + this.setBackground(Color.BLACK); + //启动自动换行 + this.setLineWrap(true); + //换行不断字 + this.setWrapStyleWord(true); + this.setVisible(true); + } +} diff --git a/src/main/java/com/eg/www/common/utils/AliYunPanUtil.java b/src/main/java/com/eg/www/common/utils/AliYunPanUtil.java new file mode 100644 index 0000000..4e331b3 --- /dev/null +++ b/src/main/java/com/eg/www/common/utils/AliYunPanUtil.java @@ -0,0 +1,459 @@ +package com.eg.www.common.utils; + +import cn.hutool.core.io.file.FileReader; +import cn.hutool.core.io.file.FileWriter; +import cn.hutool.core.io.watch.WatchMonitor; +import cn.hutool.core.io.watch.Watcher; +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.setting.Setting; +import com.eg.www.common.CommonConstants; + +import javax.swing.*; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.WatchEvent; +import java.util.List; +import java.util.Map; + +/** + * Description: 操作阿里云盘工具类 + * Author: Eg + * Date: 2021/08/29 + */ +public class AliYunPanUtil{ + + //配置文件 + Setting setting =CommonConstants.setting; + //Token文本框 + JTextField tokenText = CommonConstants.tokenText; + // 开始备份 + private JButton startBackup = CommonConstants.startBackup; + //请求工具类 + OkHttpUtil okHttpUtil = new OkHttpUtil(); + FileWriter writerLog = CommonConstants.writerLog; + FileReader readerLog = CommonConstants.readerLog; + + /** + * 开始备份 + */ + public void startBackup() { + CommonConstants.CLEAN_CONSOLE=1; + CommonConstants.BACK_STATE = true; + boolean login = this.getAliYunPanInfo();//登录阿里云 + if (!login) return; + if (!checkConfig()) return; + CommonConstants.FILE_ID = this.getFileId(CommonConstants.ROOT, CommonConstants.BACK_NAME);//备份目录ID + if (CommonConstants.BACK_TYPE==0){//普通备份 + this.scanFolders(CommonConstants.PATH,CommonConstants.FILE_ID,true); + }else { + //开始获取文件 + List folderList = FileUtil.fileFolderList(CommonConstants.PATH,FileUtil.FOLDER);//获取用户目录下所有目录 + List folderFileList = FileUtil.fileFolderList(CommonConstants.PATH,FileUtil.FILE);//本地文件夹下文件 + + //上传文件夹下文件 + if (folderFileList.size()!=0){ + CommonConstants.addConsole("获取:"+CommonConstants.PATH+" 下所有文件成功"); + uploadFileList(folderFileList,CommonConstants.FILE_ID,true); + } + + //上传文件夹下所有目录 + if (folderList.size()!=0){ + for (String folderName : folderList) { + String path = CommonConstants.PATH + FileUtil.FILE_SEPARATOR + folderName;//路径 + uploadTwoLevelFolder(CommonConstants.FILE_ID,path); + } + } + + } + CommonConstants.addConsole("本次备份:"+CommonConstants.PATH+" 下所有文件成功!..."); + startBackup.setText("开始备份"); + startBackup.setEnabled(true); + CommonConstants.BACK_STATE = false; + return; + } + + /** + * 上传二级文件夹 + * @param fileId + * @param path + */ + private void uploadTwoLevelFolder(String fileId, String path) { + CommonConstants.addConsole("开始获取:"+path); + List fileList = FileUtil.fileFolderList(path,FileUtil.FILE);//本地文件夹下文件 + uploadFileList(fileList,fileId,true); + String folderFileId = this.getFileId(fileId, "文件夹");//微信备份-文件夹 + String dateFileId = this.getFileId(folderFileId, getFolderName(path));//微信备份-文件夹-folderName + this.scanFolders(path,dateFileId,false); + } + + /** + * 获取阿里云用户信息 + * @return + * @throws Exception + */ + public boolean getAliYunPanInfo(){ + CommonConstants.addConsole("开始登录阿里云盘..."); + CommonConstants.TOKEN=""; + JSONObject data = new JSONObject(); + data.set("refresh_token",CommonConstants.REFRESH_TOKEN); + JSONObject aliYunPanInfo = okHttpUtil.doPost(CommonConstants.TOKEN_URL, data); + if (ObjectUtil.isNull(aliYunPanInfo)){ + CommonConstants.addConsole("登录失败...请检查Token填写是否正确..."); + return false; + } + CommonConstants.TOKEN = aliYunPanInfo.getStr("token_type") + " " + aliYunPanInfo.getStr("access_token"); + CommonConstants.DriveId = aliYunPanInfo.getStr("default_drive_id"); + CommonConstants.REFRESH_TOKEN = aliYunPanInfo.getStr("refresh_token"); + setting.set("tokenText",aliYunPanInfo.getStr("refresh_token")); + tokenText.setText(aliYunPanInfo.getStr("refresh_token")); + setting.store(CommonConstants.CONFIG_PATH); + setting.autoLoad(true); + if (StrUtil.isNotEmpty(CommonConstants.TOKEN)){ + CommonConstants.addConsole("登录阿里云盘成功..."); + } + return true; + } + + /** + * 获取阿里云文件列表 + * @param fileId + * @return + * @throws Exception + */ + public JSONObject getFileList(String fileId){ + JSONObject data = new JSONObject(); + data.set("drive_id",CommonConstants.DriveId); + data.set("parent_file_id",fileId); + data.set("limit",100); + data.set("all",false); + data.set("image_thumbnail_process","image/resize,w_400/format,jpeg"); + data.set("image_url_process","image/resize,w_1920/format,jpeg"); + data.set("video_thumbnail_process","video/snapshot,t_0,f_jpg,ar_auto,w_300"); + data.set("fields","*"); + data.set("order_by","updated_at"); + data.set("order_direction","DESC"); + return okHttpUtil.doPost(CommonConstants.FILE_LIST_URL,data); + } + + /** + * 创建文件夹 + * @param fileId 父级目录ID 根目录为root + * @param name 新文件夹名称 + * @return + * @throws Exception + */ + public JSONObject createFolder(String fileId,String name){ + //创建文件夹 + JSONObject data = new JSONObject(); + data.set("drive_id",CommonConstants.DriveId); + data.set("parent_file_id",fileId); + data.set("name",name); + data.set("type","folder"); + data.set("check_name_mode","refuse"); + return okHttpUtil.doPost(CommonConstants.CREATE_FILE_URL,data); + } + + /** + * 上传文件到阿里云盘 + * @return + * @throws Exception + */ + public JSONObject uploadFile(String fileId, Map fileInfo){ + JSONObject data = new JSONObject(); + JSONObject list = new JSONObject(); + JSONArray array = new JSONArray(); + list.set("part_number",1); + array.add(list); + data.set("drive_id",CommonConstants.DriveId); + data.set("name",fileInfo.get("name")); + data.set("type","file"); + data.set("content_type",fileInfo.get("content_type")); + data.set("size",fileInfo.get("size")); + data.set("parent_file_id",fileId); + data.set("part_info_list",array); + data.set("content_hash_name","sha1"); + data.set("content_hash",fileInfo.get("content_hash")); + data.set("ignoreError",false); + data.set("check_name_mode","refuse"); + return okHttpUtil.doFilePost(CommonConstants.CREATE_FILE_URL,data); + } + + /** + * 完成文件上传 + * @param fileId + * @param uploadId + * @return + * @throws Exception + */ + public JSONObject completeFile(String fileId,String uploadId){ + JSONObject data = new JSONObject(); + JSONArray array = new JSONArray(); + data.set("drive_id",CommonConstants.DriveId); + data.set("file_id",fileId); + data.set("ignoreError",true); + data.set("part_info_list",array); + data.set("upload_id",uploadId); + return okHttpUtil.doPost(CommonConstants.COMPLETE_FILE_URL,data); + } + + /** + * 删除阿里云盘文件 + * @param fileId + * @return + * @throws Exception + */ + public JSONObject deleteFile(String fileId){ + JSONObject data = new JSONObject(); + data.set("drive_id",CommonConstants.DriveId); + data.set("file_id",fileId); + return okHttpUtil.doPost(CommonConstants.DELETE_FILE_URL,data); + } + + /** + * 获取文件夹ID + * @param parentFileId 父级文件夹ID + * @param folderName 文件夹名称 + * @return + * @throws Exception + */ + public String getFileId(String parentFileId,String folderName){ + //CommonConstants.addConsole("开始获取文件夹:"+folderName); + String fileId=""; + JSONObject fileList = getFileList(parentFileId);//获取文件目录 + JSONArray fileArray = fileList.getJSONArray("items"); + if (ObjectUtil.isNotNull(fileArray) && fileArray.size()>0){ + for (int i = 0; i < fileArray.size(); i++) { + JSONObject folder = fileArray.getJSONObject(i); + if ("folder".equals(folder.getStr("type")) && folderName.equals(folder.getStr("name"))){ + fileId = folder.getStr("file_id"); + return fileId; + } + } + } + if (StrUtil.isEmpty(fileId)){ + JSONObject folder = createFolder(parentFileId, folderName); //创建备份目录 + fileId=folder.getStr("file_id"); + } + return fileId; + } + + /** + * 执行文件上传 + * @param fileId 文件夹ID + * @param fileInfo 文件信息 + * @throws Exception + */ + public void doUploadFile(String fileId,Map fileInfo){ + //写入上传文件的路径 + List logList = readerLog.readLines(); + if (!logList.contains(fileInfo.get("path"))){ + CommonConstants.addConsole("开始上传:"+fileInfo.get("path")); + JSONObject uploadFile = uploadFile(fileId,fileInfo); + if(ObjectUtil.isNotNull(uploadFile.getJSONArray("part_info_list"))){//上传新文件 + byte[] fileBytes = FileUtil.readBytes(fileInfo.get("path").toString()); + String uploadUrl = uploadFile.getJSONArray("part_info_list").getJSONObject(0).getStr("upload_url"); + okHttpUtil.uploadFileBytes(uploadUrl,fileBytes); + } + if (StrUtil.isEmpty(uploadFile.getStr("exist"))){//上传完成 + String upFileId = uploadFile.getStr("file_id"); + String uploadId = uploadFile.getStr("upload_id"); + completeFile(upFileId, uploadId); + } + writerLog.append(fileInfo.get("path")+ "\n"); + CommonConstants.addConsole("上传文件成功:"+fileInfo.get("name")); + }else { + CommonConstants.addConsole(fileInfo.get("path")+" 已上传 跳过"); + } + return; + } + + /** + * 扫描子目录 + * @param path 本地路径 + * @param pathId 备份目录 ID + * @param isUploadFile 是否上传文件 + * @throws Exception + */ + public void scanFolders(String path,String pathId,Boolean isUploadFile){ + CommonConstants.addConsole("开始获取:"+path); + //获取文件夹下所有文件 + List fileList = FileUtil.fileFolderList(path,FileUtil.FILE); + //CommonConstants.addConsole("获取:"+path+" 下所有文件成功"); + if (isUploadFile){ + uploadFileList(fileList,pathId,false); + } + //获得目录下所有文件夹 + List folderList = FileUtil.fileFolderList(path,FileUtil.FOLDER); + //循环文件夹 + for (String folder : folderList){ + String fileId = getFileId(pathId, folder);//创建文件夹-文件夹ID + String filePath = path + FileUtil.FILE_SEPARATOR + folder;//路径 + fileList = FileUtil.fileFolderList(path,FileUtil.FILE);//获取当前文件夹下所有文件 + uploadFileList(fileList,fileId,false);//上传当前文件夹内的文件 + //CommonConstants.addConsole("扫描新文件夹:"+filePath); + scanFolders(filePath,fileId,true); + } + } + + /** + * 上传文件夹下文件到某个目录 + * @param fileList 文件list + * @param pathId 阿里云文件夹ID + * @param backType 是否开启分类 + * @throws Exception + */ + public void uploadFileList(List fileList, String pathId,Boolean backType){ + List logList = readerLog.readLines(); + fileList.removeAll(logList); + for (String filePath : fileList) { + try { + Map map = FileUtil.getFileInfo(filePath); + if (backType){//开启分类 + String type = map.get("type").toString(); + String typeFileId=this.getFileId(pathId,type);//微信备份-类型 + String dateFileId=this.getFileId(typeFileId,getFolderName(filePath));//微信备份-类型-文件夹 + doUploadFile(dateFileId,map); + }else { + doUploadFile(pathId,map); + } + } catch (Exception e) { + CommonConstants.addConsole("遇到异常情况:"+e.toString()); + } + } + } + + /** + * 获取文件夹名称 + * @param thisPath + * @return + */ + public String getFolderName(String thisPath) { + String folderName = StrUtil.subAfter(thisPath , CommonConstants.PATH+"\\", false); + if (StrUtil.isNotEmpty(folderName) && !folderName.contains("\\")){ + //写入文件目录 + //writerLog.append(CommonConstants.PATH + FileUtil.FILE_SEPARATOR+folderName + ""); + }else{ + folderName = StrUtil.subBefore(folderName , "\\", false); + } + return folderName; + } + + /** + * 监控目录 + */ + public void monitorFolder() { + if (StrUtil.isEmpty(setting.getStr("pathText"))) return; + try { + Thread.sleep(300); + } catch (InterruptedException e) { + e.printStackTrace(); + } + CommonConstants.CLEAN_CONSOLE=1; + //开启目录检测 开始获取文件夹 + Console.log("开启目录检测"); + CommonConstants.addConsole("开启目录检测"); + File file = FileUtil.file(setting.getStr("pathText")); + //这里只监听文件或目录的修改事件 + WatchMonitor watchMonitor = WatchMonitor.create(file,WatchMonitor.ENTRY_CREATE,WatchMonitor.ENTRY_MODIFY); + watchMonitor.setWatcher(new Watcher(){ + @Override + public void onCreate(WatchEvent event, Path currentPath) { + Object obj = event.context(); + Console.log("创建:{}-> {}", currentPath, obj); + //备份方法不执行时候执行监听 + if (!CommonConstants.BACK_STATE){ + uploadMonitor(currentPath,obj); + } + } + + @Override + public void onModify(WatchEvent event, Path currentPath) { + Object obj = event.context(); + Console.log("修改:{}-> {}", currentPath, obj); + //备份方法不执行时候执行监听 + if (!CommonConstants.BACK_STATE){ + String path = currentPath.toString() + "\\" + obj.toString(); + //CommonConstants.addConsole("检测到:"+path+" 文件发生变化!"); + List logList = readerLog.readLines(); + logList.remove(path); + writerLog.writeLines(logList); + } + //uploadMonitor(currentPath); + } + + @Override + public void onDelete(WatchEvent event, Path currentPath) { + /*Object obj = event.context(); + Console.log("删除:{}-> {}", currentPath, obj);*/ + } + + @Override + public void onOverflow(WatchEvent event, Path currentPath) { + /*Object obj = event.context(); + Console.log("Overflow:{}-> {}", currentPath, obj);*/ + } + }); + //设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录 + //监听所有目录 + watchMonitor.setMaxDepth(Integer.MAX_VALUE); + //启动监听 + watchMonitor.start(); + } + + /** + * 上传监控目录 + * @param currentPath + */ + public void uploadMonitor(Path currentPath,Object obj) { + CommonConstants.addConsole("检测到:"+currentPath.toString()+" 目录有新文件..."); + if (checkConfig()){ + Thread backup = new Thread(() -> { + boolean login = getAliYunPanInfo();//登录阿里云 + if (!login){ + return; + } + CommonConstants.FILE_ID = getFileId(CommonConstants.ROOT, CommonConstants.BACK_NAME);//备份目录ID + uploadTwoLevelFolder(CommonConstants.FILE_ID,currentPath.toString()); + CommonConstants.addConsole("上传 "+obj.toString()+" 成功!"); + }); + backup.start(); + } + } + + /** + * 验证配置文件 + */ + public Boolean checkConfig(){ + if (StrUtil.isEmpty(setting.getStr("pathText"))){ + CommonConstants.addConsole("您没有选择需要备份的目录"); + return false; + } + if (StrUtil.isEmpty(setting.getStr("tokenText"))){ + CommonConstants.addConsole( "您没有输入阿里云token"); + return false; + } + if (StrUtil.isEmpty(setting.getStr("folderText"))){ + CommonConstants.addConsole("您没有输入需要备份到阿里云的目录"); + return false; + } + if (setting.getStr("tokenText").length()!=32){ + CommonConstants.addConsole("您输入的token不正确"); + return false; + } + if (!FileUtil.isDirectory(setting.getStr("pathText"))){ + CommonConstants.addConsole("请选择正确目录"); + return false; + } + CommonConstants.PATH = setting.getStr("pathText"); + CommonConstants.REFRESH_TOKEN = setting.getStr("tokenText"); + CommonConstants.BACK_NAME = setting.getStr("folderText"); + CommonConstants.BACK_TYPE = Integer.parseInt(setting.getStr("backType")); + return true; + } + + +} diff --git a/src/main/java/com/eg/www/common/utils/FileUtil.java b/src/main/java/com/eg/www/common/utils/FileUtil.java new file mode 100644 index 0000000..94fd3f6 --- /dev/null +++ b/src/main/java/com/eg/www/common/utils/FileUtil.java @@ -0,0 +1,178 @@ +package com.eg.www.common.utils; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; + +import javax.activation.MimetypesFileTypeMap; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: 文件操作工具类 + * Author: Eg + * Date: 2021/08/29 + */ +public class FileUtil extends cn.hutool.core.io.FileUtil { + + public static final String FILE="File";//文件 + public static final String FOLDER="Folder";//文件夹 + static List docTypes = new ArrayList<>();//文档类型 + static List compressTypes = new ArrayList<>();//压缩包类型 + static List imageTypes = new ArrayList<>();//图片类型 + static List musicTypes = new ArrayList<>();//音乐类型 + static List videoTypes = new ArrayList<>();//视频类型 + static List applyTypes = new ArrayList<>();//软件类型 + static List devTypes = new ArrayList<>();//开发类型 + + //文件类型 + static { + /** + * 文档类型 + */ + docTypes.add("xls"); + docTypes.add("xlsx"); + docTypes.add("xlsm"); + docTypes.add("doc"); + docTypes.add("docx"); + docTypes.add("ppt"); + docTypes.add("pptx"); + docTypes.add("txt"); + docTypes.add("pdf"); + docTypes.add("chm"); + docTypes.add("xmind"); + + /** + * 压缩包类型 + */ + compressTypes.add("zip"); + compressTypes.add("rar"); + compressTypes.add("7z"); + compressTypes.add("tar.gz"); + compressTypes.add("gz"); + + /** + * 图片类型 + */ + imageTypes.add("png"); + imageTypes.add("jpg"); + imageTypes.add("jpeg"); + imageTypes.add("gif"); + imageTypes.add("ico"); + imageTypes.add("psd"); + + /** + * 音频类型 + */ + musicTypes.add("mp3"); + musicTypes.add("wma"); + musicTypes.add("aac"); + musicTypes.add("m4a"); + musicTypes.add("amr"); + + /** + * 视频类型 + */ + videoTypes.add("mp4"); + videoTypes.add("avi"); + videoTypes.add("3gp"); + videoTypes.add("flv"); + videoTypes.add("mkv"); + videoTypes.add("mov"); + videoTypes.add("wmv"); + + /** + * 软件类型 + */ + applyTypes.add("1"); + applyTypes.add("apk"); + applyTypes.add("exe"); + applyTypes.add("ipa"); + applyTypes.add("app"); + applyTypes.add("dmg"); + applyTypes.add("rpm"); + + /** + * 开发类型 + */ + devTypes.add("properties"); + devTypes.add("java"); + devTypes.add("php"); + devTypes.add("jsp"); + devTypes.add("js"); + devTypes.add("vue"); + devTypes.add("sh"); + devTypes.add("sql"); + devTypes.add("xml"); + devTypes.add("html"); + devTypes.add("conf"); + devTypes.add("jar"); + devTypes.add("bat"); + devTypes.add("yml"); + devTypes.add("css"); + devTypes.add("json"); + devTypes.add("out"); + devTypes.add("class"); + } + + /** + * 获取文件类型 + * @param name 文件名 + * @return 返回文件类型 + */ + public static String getFileTypes(String name){ + //获取文件的后缀名 + String suffix = getSuffix(name).toLowerCase(); + if (docTypes.contains(suffix)) return "文档"; + if (imageTypes.contains(suffix)) return "图片"; + if (musicTypes.contains(suffix)) return "音频"; + if (videoTypes.contains(suffix)) return "视频"; + if (applyTypes.contains(suffix)) return "软件"; + if (devTypes.contains(suffix)) return "开发"; + if (compressTypes.contains(suffix)) return "压缩包"; + return "其它"; + } + + /** + * 读取目录下的文件 或 文件夹 + * 不含子目录 + * @param path 目录绝对路径或者相对路径 + * @param type 文件或文件夹 为空默认返回文件夹 + * @return 列表 + */ + public static List fileFolderList(String path,String type) { + List List = new ArrayList<>(); + final File[] files = ls(path); + for (File file : files) { + if(FILE.equals(type) && file.isFile()){ + List.add(file.getPath()); + } + if (FOLDER.equals(type) && file.isDirectory()){ + List.add(file.getName()); + } + } + return List; + } + + /** + * 获取文件信息 + * @param path 文件路径 + */ + public static Map getFileInfo(String path) { + String contentType= new MimetypesFileTypeMap().getContentType(new File(path)); + if (StrUtil.isEmpty(contentType)) contentType="application/octet-stream"; + Map map = new HashMap(); + File file = file(path); + String type = getFileTypes(file.getName()); + map.put("name",file.getName()); + map.put("path",file.getPath()); + map.put("size",file.length()); + map.put("type",type); + map.put("content_type",contentType); + map.put("content_hash",DigestUtil.sha1Hex(file).toUpperCase()); + return map; + } + +} diff --git a/src/main/java/com/eg/www/common/utils/OkHttpUtil.java b/src/main/java/com/eg/www/common/utils/OkHttpUtil.java new file mode 100644 index 0000000..e7cb768 --- /dev/null +++ b/src/main/java/com/eg/www/common/utils/OkHttpUtil.java @@ -0,0 +1,127 @@ +package com.eg.www.common.utils; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import okhttp3.*; +import com.eg.www.common.CommonConstants; +import com.eg.www.common.MyConsole; + +import java.util.concurrent.TimeUnit; + +/** + * Description: http请求工具类 + * Author: Eg + * Date: 2021/08/29 + */ +public class OkHttpUtil { + + // 日志界面 + MyConsole console = CommonConstants.console; + + static OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(5, TimeUnit.MINUTES).build(); + static MediaType mediaType = MediaType.parse("application/json"); + static RequestBody body; + static Request request; + + + /** + * 阿里云盘交互的POST请求 + * @param url + * @param data + * @return + * @throws Exception + */ + public JSONObject doPost(String url, JSONObject data){ + int errNum=0; + try { + body = RequestBody.create(mediaType,data.toString()); + request = new Request.Builder() + .url(url) + .method("POST", body) + .addHeader("authorization", CommonConstants.TOKEN) + .addHeader("Content-Type", "application/json").build(); + Response response = client.newCall(request).execute(); + String result = response.body().string(); + CommonConstants.addConsole("请求状态码:"+response.code()); + //System.out.println("result:>>>>>>>>>>>>>>>>>>>"+result); + return JSONUtil.parseObj(result); + } catch (Exception e) { + if (e.toString().contains("A JSONObject text")){ + CommonConstants.addConsole("普通请求遇到异常:"+e.toString()); + return null; + }else { + errNum++; + CommonConstants.addConsole("普通请求遇到异常:"+e.toString()); + if (errNum>5){ + CommonConstants.addConsole("普通请求失败次数超过:"+errNum+" 次....已停止"); + return null; + }else{ + CommonConstants.addConsole("普通请求发起第:"+errNum+" 次重试"); + return doPost(url,data); + } + } + } + } + + /** + * 阿里云盘上传文件的POST请求 + * @param url + * @param data + * @return + * @throws Exception + */ + public JSONObject doFilePost(String url,JSONObject data){ + int errNum=0; + try { + RequestBody body = RequestBody.create(mediaType, data.toString()); + request = new Request.Builder() + .url(url) + .method("POST", body) + .addHeader("authorization",CommonConstants.TOKEN) + .addHeader("Content-Type", "multipart/form-data").build(); + Response response = client.newCall(request).execute(); + String result = response.body().string(); + CommonConstants.addConsole("请求状态码:"+response.code()); + //System.out.println("result:>>>>>>>>>>>>>>>>>>>"+result); + return JSONUtil.parseObj(result); + } catch (Exception e) { + errNum++; + CommonConstants.addConsole("上传请求遇到异常:"+e.toString()); + if (errNum>5){ + CommonConstants.addConsole("上传请求失败次数超过:"+errNum+" 次....已停止"); + return null; + }else{ + CommonConstants.addConsole("上传请求发起第:"+errNum+" 次重试"); + return doFilePost(url,data); + } + } + } + + /** + * 阿里云盘上传二进制文件 + * @param url + * @param fileBytes + * @return + * @throws Exception + */ + public void uploadFileBytes(String url,byte[] fileBytes){ + int errNum=0; + try { + RequestBody body = RequestBody.create(fileBytes); + Request request = new Request.Builder().url(url).method("PUT",body).build(); + Response response = client.newCall(request).execute(); + //String result=response.body().string(); + CommonConstants.addConsole("上传文件请求状态码:"+response.code()); + } catch (Exception e) { + errNum++; + CommonConstants.addConsole("上传文件遇到异常:"+e.toString()); + if (errNum>5){ + CommonConstants.addConsole("上传文件失败次数超过:"+errNum+" 次....已停止"); + return; + }else{ + CommonConstants.addConsole("上传文件发起第:"+errNum+" 次重试"); + uploadFileBytes(url,fileBytes); + } + } + } +} diff --git a/src/main/java/com/eg/www/common/utils/getToken.java b/src/main/java/com/eg/www/common/utils/getToken.java new file mode 100644 index 0000000..a3eb4c4 --- /dev/null +++ b/src/main/java/com/eg/www/common/utils/getToken.java @@ -0,0 +1,10 @@ +package com.eg.www.common.utils; + +/** + * @author: Eg + * @Date: 2021/8/29 17:50 + */ +public class getToken { + + +} diff --git a/src/main/resources/config/cron.setting b/src/main/resources/config/cron.setting new file mode 100644 index 0000000..a9f36f8 --- /dev/null +++ b/src/main/resources/config/cron.setting @@ -0,0 +1,13 @@ +#我是注释 +#执行的类或对象方法所在包的名字 +#[com.eg.www] +#需要执行的类名和方法名 +#App.Test = * * * * * ? * +#执行的类或对象方法所在包的名字 +[com.eg.www.common] +#每小时刷新阿里云盘登录信息 +CronTask.updateALiYunPanToken = 0 0 0/1 * * ? +#执行的类或对象方法所在包的名字 +[com.eg.www.common] +#每天晚上八点自动备份文件 +CronTask.backFileList = 0 0 20 * * ? * diff --git a/src/main/resources/images/logo.png b/src/main/resources/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a884f98bd481c5cf5f1fb4b90ed140a233e56a47 GIT binary patch literal 14718 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/AliYunPan$2.class b/target/classes/com/eg/www/AliYunPan$2.class new file mode 100644 index 0000000000000000000000000000000000000000..6d0447fa71cd351061af034d2a1df713625f4901 GIT binary patch literal 1049 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 P0}uQpcy{wsy!(Fu50$`@ literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/App.class b/target/classes/com/eg/www/App.class new file mode 100644 index 0000000000000000000000000000000000000000..b5720ba29a7f24c86333de5e876e7e6b3e0fb3ed GIT binary patch literal 685 zcmZuv+iuf95IvhXaqO7HB)xGhEfkz`@e4wNA|zC)5>kLlDM6)A8+Vm#WqU1qO~hxx z1Fb;f1NbP!tcz%n*oWDf<2h$8-k-m|{Q&S74_!D|vvI{m4Qnp0;+iqn9o)c87wfoX zW5dQKL-V;zrGCLs4+difYgZi$hVD?N;!T-MM1H_0F(JL7ig-Ncxis+~(9$zmF!;kr zC83yx^Z7h{nPoeqlW>_btOQ5H6aJBhF;A!ANar%0?o@SnJ|$-VKc9(wAPUXkj#QaP zVo#d-Ez*5tq&&E2Gb}BZjOAgO?(@{fZ4YTMvY(e z_I7e2A}YEXrQxj9O2uK6t2Ept^G?f{p;2g_Q%0u{`Zd?lY$PI;9#gx)2Q$)w*yvNC zMM67OB@vd-S0GimPxEWqg5U}5s9#n87iO?ClN8hPtl-sPj19EtUz$?~?F4PI9z`MD zjPAzvDcEOnYPdwUS%D5ZX!_`5snT5j+t3zin&W&y(^p?%8!=WjWnLlhlqPvb$O`#2to{ab7KWAp literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/common/CommonConstants.class b/target/classes/com/eg/www/common/CommonConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..cab59aba90a9783023a319f0279d92d0eef522c9 GIT binary patch literal 3563 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 D@u~n9 literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/common/MyConsole.class b/target/classes/com/eg/www/common/MyConsole.class new file mode 100644 index 0000000000000000000000000000000000000000..e0ce80ee87e2d8c2ee542b8829bc10353593239e GIT binary patch literal 1193 zcmaJ=Sx*yT6g>mQ);g40-1ps5wd1}oKoeuM>H`L%KIjMoj+PFY4p!gPC za&Ux{28lyiSdL1ETANQv>Jjl&gcx5~sTU))qAD}LKsvP3a*V_LaJ|wjNKHaK9v8@L zR-(ee3n3*MQzFt1Dk?`C6;|Smcuo`|Vzf!9(NsCwL}%_ArB$t$_R6e@=T}ych4Pq& z=^Pr(^vitz3-eZ&)i?4j`@rZ+=$TO~`PLY{YjoYP28PU@!Ce0(n>X5r@;zhuM5jJ- z+e-H2FF(`Muk2tweci98Zy0ZSjNTVU`~6(vm2r)Xq>&k^aC4aXx4!CDInp4hJl10a zhmGd_xA}{O_M}74J}^5w%-+{V?~vWV%G@y@UeVLn^z38v9;r;ZdAhev9L^Z+ZPswc zmT2c1Lv41h9mz`FOPEideZ6?exOv^mzBD?olARkJq&j5eAHCNc5?flNXak2e{)yLIF@Y-lSsDPBrr5*4 zVVZwpAVoN1lExZQ^MBQ*sr8IsoEX=HkP=Z;4khu^vPJ{twHyCBp=za6ZLgwAO{&t$ z^p+QD{*GaLP*NSP3LUVctHt`WKclBmHrtIlRcxWb_8()xULqM$qg{wdb&5(=-9**O zF`0G+i)r7=X@LQb9vW%F8RUIN5j{X--~%{cQ8iKRDMvxXA@B zKw0j{L6DIE literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/common/utils/AliYunPanUtil$1.class b/target/classes/com/eg/www/common/utils/AliYunPanUtil$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a2a9bc2de37b401e16df5fba391f7d8ca7095c4d GIT binary patch literal 2615 zcmbtWT~iZR7=8{(SQ1vH6hF}VjS>R5(%LVfSd3^bL8w6~NNYEn1s0b*akC*>$9Bdm zuX@!hd(&UgnRYA|?Z)PfH*TuvaNoIb>uy34d+TrCR+V{y7& zNniq#t@sF6)i9gD6s~Ewu3=iBIaqXxU8e=QGnQO7>;4*^91e2HkmEVQus|xg%{4vO1)^!0w*_`(9M8T|TF%-2l$mpBY0pT@bg!GfqsCQZ zRKXI^FMFQtr(LsHv^nhAUcRmYqHK{~+PBSs83vM>C3D3zJVzSyj%yp!W?(IjuGn5M z*f29`28)9VZp>EG0{a^r>Xr($S|#77n_4B%(cl`!5{Ss$l42P`a7}N)n8+>JRzQq< zHdDV_Sf_umA=F0Jq0}%J?#KqFb!*%#gmSSl1mam|!83!BPr_&Zo3L8n5WL2jl8wu} zGk=%WDuk5kQD+0+@fMg|bLB$DDN>xaN+i`LhO%(7tHCr>8Hc>95flNYx?sDus!l?B z6Dzhq@5(X*q)J?)MKLxp$wY#xiL5RL4zxroq&agQX)6=5G7rx9|S^daZux z-i@UdCg)3zo40)p^Ewu=sKWs(E#`FGf~#R!hX<*lpyM`t9Yq8hN;+0RqTSotZCwKb zhb_-oECo`!+?Kv=u!+m6e=A*V`vNDn6^mWNJ?#Y2zbF-Kc4ks_`o56X7JGx0wxk!> zcUb9;WKUfoYYlv$0b5w+wDgKn)i1(E5lB{>vAzXvyckSDIr<`zba)b}kb&t1JOdKv zN77?Avr{8eqttqqtV#t}n)&exHy#p=%^&vn)(P7;b61}1%|KS_+eo{%1Def3!S?b3 z{abLW7iv?Vu2f^NAl~}vq?-R~=*JaDU+Pqis?Jr))4pD)`c1hrq*=4@ z2>0z}xxy0dt|w3}YY#<@mwhML4$$e)?J^MA7lLO#{pVj|H}d;7WTm_6uS&k-qFqv_Jb3nty=y2zu%< zL|^|ZT2!WJm`S08ScWD%>=OkX61UMUiectdC1x#i5?wfn3Cv01Swke z>RcCkdDllv3&h{(*3ger95un9{q#C&5o7LV+O2ie@vTr_dWOWz6SVfNK^IuXj`p4W zBa2enJ-hO$Sul{$M2;L#| XCcKNYyhiy7H^fb$+Lvz-yz=uee3Ed- literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/common/utils/AliYunPanUtil.class b/target/classes/com/eg/www/common/utils/AliYunPanUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..b8307ca5f9209cc5ecd2785b15fbfae6b801380f GIT binary patch literal 13796 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/common/utils/FileUtil.class b/target/classes/com/eg/www/common/utils/FileUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..0c4ce3c7de82c0dfba7824ace6161511c0d5e67c GIT binary patch literal 4898 zcmbVQ33yc175?v=N#D68<%buPgEm)jS!&H=~$@ z+avgv;!i2^?I^y3rzO4{!S|v#CNJ>&O3xoiTvCZ=@T|nu5k_}0cthe3 z5`UEVlf<7T-jw)@#9t-elK7j%-zDCb_=m(h691HVSK?n12POV3@t(x{Qa}nJg&{>q zim()AQj|*(kwQvQAw^V*N-0b!hDcE*MYR-1NHJ83m=wdL7#{)&XJD)enE`LgyT1@k+H-2#W$idFyrh>AgBDjv}B(UoL((u28L}kIXD>Ln` zz~sY-E;W^|qeYboH{;tGUtI?;KW%yH)`Q3n9Fku(ckswz&d)Chl3~r}PCMZ*QbD@% z!*%$dWy!^fR3S#At!`H~VXH7=AgE3S*9@h#iF5I3Q;f#N3<*<=5o1ksqbDLpnPQw6 z&j5Pm`iow<`BoDjM-SP78~49@$wekU5wO>9dg%3At~PN_z+Sua!hn4;&mO=3<-PqT zK9%3M@7x1da^*I~Dh^z6>8tzhK5*G~C2@QIft}|I4AV|LA)B@ORIr$0f;duO(ud^< zV@p|Oiiu*pDJF@dOi@Ei#N@z&e2AOkXf-}Xj1`!o&gzX@3E%0qe200r+DY3gN^?q% zx?El)lP}Pz5YKd#m}-h+L~TS&Gew=4E-+e^2Pcu2;U;|BZ^-#s+e!-z)%L8gavhXs z;!06(;v(hi22;!saq69Owo&h6#mtD9Ws2Ei4o@w_*rt5i4A2gWiHNzTm?vsYF<%)H z>P<0|!fcu1s^h^SmQE7391D3K6FbaS5x}T=S#R3Ow2^IdXl^KLWd)4+ z+juR$m7S3!FjN!rGD)_b9@}uIXDgC)loThy)CqYxB_r+4X4{jt*jg5K2&Lx)I8CXX zrD-9n+hIF9sZMK8b*u3$LF=lvC(TyOB(l6MZ0%l^WR4d|@zkESv^qQMQTM2qbv--l zJF1w3mA5(Lb*NRHIkrY8$3xxfSut{~LZRH&6x-f3+i-^;bo8{cqEp!&+H5KB^r?wZ zA{PkFxfv3-ixXvul%)p8CNlAkF5h)itl3#RUWg8rQGBa{OD}ojSQK>}n=g~Bmy0}WJRaM%iVNRchKw{}@-dASn= zJMF7gA|h1lJb&3da>sXW`Qq5hQoW zQ`fqnRB*wghZg5j-3yE8z?7Xys`rf!Tvfd2K!s*khd9j7gd`iiS<4ZgV-ajM}$S z>&?`AE45a(jLhqcOLzs~jubutTST!a*qI}lENNn`k4D^pwe<7Z9BaoH z0_*0WjPna|C9Xn5X^X1^I~BSnuv2pVwG0P?vNm$(b@bu&T&eCjKi9`O<&CKbzt3om z&>zA7=OVa)|AN7C5Oopkco*Z};d%M6{XD&OBelqTtA@IlQN{&(F^S$fYA^ z=9q91&SG@r7tLkJE68hR18TvPA$c%p_YG+e3SDh*F6!ire4 zhO0Gf(Qu81Cl_I5>=X@8)v#5=wHltL;W`aZFTx?Qk7>AG!wnj4)bI=q&(!d&BCL*W z((r5zEe$ton9#6ILtDdk4U-ynXy|Czso@q4QyQi<%xLIp=;fh$SA?o&qKb7(RblnZ z%5avKBl#TGVk~B192R3dnlPCebTrOjb|zVavivRP9Im(+(^$9am~YdWt@U^q4S0gP zo@T~9k2!dW75@#)!`oQI3bk06I8Kbh5>bQWMFW(P1owW1NIeV;!~_7E(qEX`=@j<2<;=_8+#Po-qIb literal 0 HcmV?d00001 diff --git a/target/classes/com/eg/www/common/utils/OkHttpUtil.class b/target/classes/com/eg/www/common/utils/OkHttpUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..1914610b032b421adb8ecba24f10cf353fdec847 GIT binary patch literal 4642 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