当前位置: 首页 > article >正文

java实现系统文件管理

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.kler.cn/a/315149.html

相关文章:

  • Elasticsearch基本概念及使用
  • C++ 并发专题 - 自旋锁的实现(Spinlock)
  • 大厂的 404 页面都长啥样?看看你都见过吗~~~
  • jmeter常用配置元件介绍总结之后置处理器
  • FatLab:我的编程课程系列
  • STM32 GPIO 配置
  • 如何在自动化测试中应用装饰器、多线程优化自动化架构?
  • ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案
  • 音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现
  • OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
  • 【Web】御网杯信息安全大赛2024 wp(全)
  • 如何在堆和栈上分别创建一个`QObject`子类对象
  • 走在时代前沿:让ChatGPT成为你的职场超级助手
  • 环形链表问题——力扣141,142
  • Facebook运营:账号类型有哪些?有必要用静态住宅IP吗?
  • 快速理解MySQL索引:优化查询性能的利器
  • 动手深度学习 线性回归从零开始实现实例
  • 招商银行招行笔试难度递增?要点解读
  • harbor私有镜像仓库,搭建及管理
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第七集:制作小骑士完整的冲刺Dash行为
  • 如何切换淘宝最新镜像源(npm)【2024版】
  • 828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
  • contenteditable=“true“可编辑div字数限制
  • qwen2.5 vllm推理;openai function call调用中文离线agents使用
  • 基于树莓派ubuntu20.04的ros-noetic小车
  • 程序员软硬通吃的核心竞争力修炼指南