java实现系统文件管理

news2024/12/26 11:58:06

java实现系统文件管理

环境:jdk17+springboot+Vue+ElementUI
背景:公司所做的项目需要别的系统向我们服务器上传文件,当我们需要查看这些文件什么时候上传的、文件数据是怎样的,只能去机房,排查问题效率较低,做此页面,可快速查看上传的文件信息,且可下载到本地查看。为了生产安全,不支持修改及上传文件,如果有的朋友想做,可自行查找资料。
需求:实现系统文件的查询及下载。展示系统的文件信息,如文件名、文件大小、最后更新时间及权限等。
注意本篇文章是以window系统做的样例,不过一般服务器都是在linux系统,只需将前端的初始地址换成linux地址,一般格式为:/home/app。
效果图
在这里插入图片描述
直接上代码,前端代码:

<template>
  <div>
    <div>
      <el-col :xl="4" :lg="5">
        <el-input v-model="curPath" label-width='80px' size="small" type="text">当前位置:</el-input>
      </el-col>
      <el-button type="primary" size="small" @click="getParentData()" icon="el-icon-back">返回上级</el-button>
      <el-button type="primary" size="small" @click="refresh()" icon="el-icon-refresh">刷新</el-button>
    </div>
    <el-table :data="fileList" v-loading="tableLoading">
      <el-table-column label="名称" prop="fileName">
        <!-- eslint-disable-next-line-->
        <template slot-scope="scope">
          <el-button type="text" v-if="!scope.row.fileType" @click="getSonData(scope.row)">{{
              scope.row.fileName
            }}
          </el-button>
          <span v-if="scope.row.fileType">{{ scope.row.fileName }}</span>
        </template>
      </el-table-column>
      <el-table-column label="类型" align="center">
        <!-- eslint-disable-next-line-->
        <template slot-scope="scope">
          <div>
            {{ typeName(scope.row.fileType) }}
          </div>
        </template>
      </el-table-column>
      <el-table-column label="大小" prop="fileSize"></el-table-column>
      <el-table-column label="更新时间" prop="lastModifiedDate"></el-table-column>
      <el-table-column align="center" label="权限" width="120">
        <!-- eslint-disable-next-line-->
        <template slot-scope="scope">
          <div>
            {{ getAuthority(scope.row) }}
          </div>
        </template>
      </el-table-column>
      <el-table-column label="操作">
        <!-- eslint-disable-next-line-->
        <template slot-scope="scope">
          <el-button size="mini" v-if="scope.row.fileType" type="text" @click="download(scope.row.path)">下载
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
import axios from "axios";

export default {
  name: 'App',
  data() {
    return {
      curPath: "D:\\",
      fileList: [],
      tableLoading: false,
    }
  },
  created() {
    this.getData()
  },
  methods: {
    getData: function () {
      const vm = this
      const params = {
        path: this.curPath
      }
      axios({
        method: 'get',
        url: "/sysFile/getSysFiles",
        params
      }).then(res => {
        const result = res.data
        if (result && result.code === 200) {
          this.fileList = result.data
          console.log(this.fileList)
        }
        vm.tableLoading = false
      })
    },
    getSonData(row) {
      this.curPath = row.path
      this.getData()
    },
    getParentData() {
      if (this.curPath === '') {
        this.$message({
          type: 'warning',
          message: '没有上级!'
        })
        return
      }
      // linux系统中,将 \\ 改为 / 即可
      this.curPath = this.curPath.slice(0, this.curPath.lastIndexOf("\\"))
      this.getData()
    },
    refresh() {
      this.type = 0
      this.getData()
    },
    download(path) {
      const params = {
        path: path
      }
      axios({
        method: 'get',
        url: "/sysFile/downloadFile",
        responseType: 'blob',
        params
      }).then(res => {
        // linux系统中,将 \\ 改为 / 即可
        const fileName = path.slice(path.lastIndexOf("\\") + 1, path.length)
        const blob = new Blob([res.data])
        if ('download' in document.createElement('a')) {
          // 非IE下载
          console.log('非IE')
          const elink = document.createElement('a')
          elink.download = fileName
          elink.style.display = 'none'
          elink.href = URL.createObjectURL(blob)
          document.body.appendChild(elink)
          elink.click()
          URL.revokeObjectURL(elink.href)
          // 释放URL 对象
          document.body.removeChild(elink)
        } else {
          // IE10+下载
          navigator.msSaveBlob(blob, fileName)
        }
      })
    },
    typeName(type) {
      if (type) {
        return "文件"
      }
      return "文件夹"
    },
    getAuthority(row) {
      let authority = ''
      if (row.canRead) {
        authority = authority + 'r'
      } else {
        authority = authority + '-'
      }
      if (row.canWrite) {
        authority = authority + 'w'
      } else {
        authority = authority + '-'
      }
      if (row.canExecute) {
        authority = authority + 'x'
      } else {
        authority = authority + '-'
      }
      return authority
    }
  }
}
</script>

<style>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
}

.el-aside {
  background-color: #D3DCE6;
  color: #333;
  text-align: center;
  line-height: 200px;
}

.el-main {
  background-color: #E9EEF3;
  color: #333;
  text-align: center;
  line-height: 160px;
}

body > .el-container {
  margin-bottom: 40px;
}

.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {
  line-height: 260px;
}

.el-container:nth-child(7) .el-aside {
  line-height: 320px;
}
</style>

后端代码:

package org.wjg.onlinexml.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
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 org.wjg.onlinexml.po.Result;
import org.wjg.onlinexml.po.SysFileDo;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
public class SysFileController {
    private static final SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @GetMapping("/getSysFiles")
    public Result getSysFiles(@RequestParam String path) {
        try {
            File files = null;
            if (!StringUtils.isEmpty(path)) {
                files = new File(path);
            } else {
                return Result.builder().code(200).msg("路径为空").build();
            }
            if (!files.exists()) {
                return Result.builder().code(200).msg("文件不存在").build();
            }
            List<SysFileDo> result = new ArrayList<>();
            for (File file : files.listFiles()) {
                SysFileDo sysFileDo = new SysFileDo();
                //文件名
                sysFileDo.setFileName(file.getName());
                //是否为文件
                sysFileDo.setFileType(file.isFile());
                //文件大小,文件夹大小一般形式为0,不过可以自己遍历文件夹下的内容计算该文件夹的大小
                sysFileDo.setFileSize(file.length() / 1024 + "KB");
                //是否可执行
                sysFileDo.setCanExecute(file.canExecute());
                //是否可读
                sysFileDo.setCanRead(file.canRead());
                //是否可写(以上三种权限跟实际可能会有偏差的)
                sysFileDo.setCanWrite(file.canWrite());
                // 最后修改时间
                sysFileDo.setLastModifiedDate(simple.format(new Date(file.lastModified())));
                //最后修改时间的时间戳,方便排序
                sysFileDo.setLastModified(file.lastModified());
                //当前路径
                sysFileDo.setPath(file.getAbsolutePath());
                result.add(sysFileDo);
            }
            Collections.sort(result, Comparator.comparing(SysFileDo::getLastModified));
            Collections.reverse(result);
            return Result.builder().code(200).msg("查询成功").data(result).build();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.builder().build();
    }

    @RequestMapping("/downloadFile")
    public ResponseEntity<byte[]> download(@RequestParam String path) throws IOException {

        File file = new File(path);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentDispositionFormData("attachment", "");
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.CREATED);
    }

}

实体类:

@Data
@NoArgsConstructor
public class SysFileDo {
    private String fileName;
    private boolean fileType;
    private String fileSize;
    private boolean canRead;
    private boolean canExecute;
    private boolean canWrite;
    private String lastModifiedDate;
    private long lastModified;
    private String path;
}
package org.wjg.onlinexml.po;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private int code;
    private String msg;
    private T data;
}

好了,主要的代码就这些。还有两个依赖:

		<!-- 处理文件上传的 Java 库 -->
		<dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
        </dependency>
        <!--  Apache 的开源工具库,包含了许多实用的文件操作、流操作相关的功能和工具类,比如文件读写、文件和目录的操作、流的处理和转换 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis复习笔记整理

目录 1、Redis简介 1.1 补充数据类型Stream 1.2 Redis底层数据结构 1.3 Redis为什么快 1.4 持久化机制* 1.4.1 RDB持久化 bgsave执行流程 如何保证数据一致性 快照操作期间服务崩溃 RDB优缺点 1.4.2 AOF持久化 为什么采用写后日志 如何实现AOF 什么是AOF重写 AO…

期末满分之模拟实现字符串函数

&#xff08;一&#xff09;strcpy 首先我们来了解该函数的使用方式 最简单的理解就是“复制粘贴”&#xff0c;比如现在有一个数组arr1&#xff0c;存放着 hello &#xff1b;还有一个数组arr2&#xff0c;存放着 boy &#xff1b;那么使用该函数之后&#xff0c;形如 strcpy&…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

mongoDB-1

文章目录 一、疑似坑1.11.2 mongo ops manager 一、疑似坑 1.1 https://www.bilibili.com/video/BV1H1421R7WD 2.x开始用&#xff0c;现在应该6.x了吧&#xff0c;早期四处鼓吹&#xff0c;为公司打造全mongo服务&#xff0c;为并发几千做了优化&#xff0c;原本打算替代MySQ…

【C++】——list

文章目录 list介绍和使用list注意事项 list模拟实现list和vector的不同 list介绍和使用 在C中&#xff0c;list是一个带头双向链表 list注意事项 迭代器失效 删除元素&#xff1a;当使用迭代器删除一个元素时&#xff0c;指向该元素的迭代器会失效&#xff0c;但是不会影响其他…

订单防重复提交:token 发放以及校验

订单防重复提交&#xff1a;token 发放以及校验 1. 基于Token校验避免订单重复提交 1. 基于Token校验避免订单重复提交 在很多秒杀场景中&#xff0c;用户为了能下单成功&#xff0c;会频繁的点击下单按钮&#xff0c;这时候如果没有做好控制的话&#xff0c;就可能会给一个用…

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…

面向对象程序设计之继承(C++)

1.继承的定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有类特性的基础上进⾏扩展&#xff0c;增加⽅法(成员函数)和属性(成员变量)&#xff0c;这样产⽣新的类&#xff0c;称派⽣类。继承 呈现了⾯向…

Day26_0.1基础学习MATLAB学习小技巧总结(26)——数据插值

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a; 1、《MATLAB基础教程 (第三版) (薛山)》 2、《MATL…

Delphi CxGrid的主从表显示设置

界面编辑建立两个不同级别的视图层级-Layout 其实这是一个主从表关系&#xff0c; 1&#xff1a;填好主表的keyfieldnames 2&#xff1a;填好从表的keyfieldnames 3&#xff1a;填好从表的 detaikeyfieldNames与masterkeyfieldnames 4: 从表的数据源一定要按与主表关联的…

Vue实用操作-2-如何使用网页开发者工具

第一步&#xff0c;添加扩展&#xff0c;live服务器 第二步&#xff0c;将 favicon.ico 文件加入到根目录下 第三步&#xff0c;选择以服务器方式运行&#xff0c;并打开浏览器 第四步&#xff0c;在极简插件你中找到 vue 对应插件&#xff0c;安装到扩展插件中 第五步&#xf…

通过hosts.allow和hosts.deny限制用户登录

1、Hosts.allow和host.deny说明 两个文件是控制远程访问设置的&#xff0c;通过设置这个文件可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务。如果请求访问的主机名或IP不包含在/etc/hosts.allow中&#xff0c;那么tcpd进程就检查/etc/hosts.deny。看请求访问的主机…

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化&#xff08;ASLR&#xff09;设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.c解释 createBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客&#xff0c;大家可以先看看栈溢出…

Qt ORM模块使用说明

附源码&#xff1a;QxOrm是一个C库资源-CSDN文库 使用说明 把QyOrm文件夹拷贝到自己的工程项目下, 在自己项目里的Pro文件里添加include($$PWD/QyOrm/QyOrm.pri)就能使用了 示例test_qyorm.h写了表的定义,Test_QyOrm_Main.cpp中写了所有支持的功能的例子: 通过自动表单添加…

C++——异常处理机制(try/catch/throw)

一、什么是异常处理机制 C++中的异常处理机制是一种用来检测和处理程序执行期间可能存在的异常情况的技术。它允许开发者编写健壮的代码,能够提前预判和处理程序执行可能会出现的错误,保证程序正常执行,而不会导致程序崩溃。 C++异常处理主要由几个关键字组成: try、cat…

C++笔记之std::map的实用操作

C++笔记之std::map的实用操作 code review 文章目录 C++笔记之std::map的实用操作1.初始化1.1.使用列表初始化1.2.使用 `insert` 方法1.3.使用 `emplace` 方法1.4.复制构造1.5.移动构造2.赋值2.1.列表赋值2.2.插入元素2.3.批量插入3.取值3.1.使用 `[]` 操作符3.2.使用 `at()` …

Vue路由配置、网络请求访问框架项目、element组件介绍学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

回归预测|基于开普勒优化相关向量机的数据回归预测Matlab程序KOA-RVM 多特征输入单输出 含基础RVM

回归预测|基于开普勒优化相关向量机的数据回归预测Matlab程序KOA-RVM 多特征输入单输出 含基础RVM 文章目录 一、基本原理1. **相关向量机&#xff08;RVM&#xff09;**2. **开普勒优化算法&#xff08;KOA&#xff09;**3. **KOA-RVM回归预测模型**总结 二、实验结果三、核心…

k8s集群备份与迁移

什么是 Velero? Velero 是一个用Go语言开发的开源工具&#xff0c;用于 Kubernetes 集群的备份、恢复、灾难恢复和迁移。 Velero备份工作流程 当用户发起velero backup create时&#xff0c;会执行如下四个动作&#xff1a; velero客户端调用Kubernetes API创建自定义资源并…

启动windows更新/停止windows更新,在配置更新中关闭自动更新的方法

在Windows操作系统中&#xff0c;启动或停止Windows更新&#xff0c;以及调整“配置更新”的关闭方法&#xff0c;涉及多种途径&#xff0c;这里将详细阐述几种常用的专业方法。 启动Windows更新 1.通过Windows服务管理器&#xff1a; -打开“运行”对话框&#xff08;…