目录
1.FileInfo实体类
package cn.piesat.document.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FileInfo {
/**
* 文件夹或文件名
*/
private String fileName;
/**
* 相对路径
*/
private String filePath;
/**
* 绝对路径
*/
private String absolutePath;
/**
* 文件大小
*/
private Long fileSize;
/**
* 更新时间
*/
private Date updateTime;
/**
* 文件中子文件
*/
private List<FileInfo> childrenFileList;
/**
* 文件类型 1其他文件 2-模板文件 判断选择不同的根路径
*/
private Integer fileType;
}
2.service接口
/**
* 获取文件目录树
*
* @param fileInfo 文件信息
* @param isFile 是否获得文件
* @param isChildren 是否获得子集
* @return 文件目录树
* @throws FileNotFoundException
*/
List<FileInfo> getFileDirectoryTree(FileInfo fileInfo, Boolean isFile, Boolean isChildren) throws FileNotFoundException;
/**
* 新建文件夹
*
* @param fileInfo 文件信息
* @return 新建成功返回true否则false
*/
boolean newFolder(FileInfo fileInfo);
/**
* 删除文件
*
* @param fileInfo 文件信息
* @return 删除成功返回true否则false
*/
boolean delFile(FileInfo fileInfo);
3. impl实现
/**
* 获取文档目录树
*
* @param fileInfo 文件信息
* @param isFile 是否获得文件
* @param isChildren 是否获得子集
* @return
* @throws FileNotFoundException
*/
@Override
public List<FileInfo> getFileDirectoryTree(FileInfo fileInfo, Boolean isFile, Boolean isChildren) throws FileNotFoundException {
List<FileInfo> tree = new ArrayList<>();
//获取根路径配置
String rootDirectory = getRootDirectory(fileInfo.getFileType());
File file = new File(rootDirectory + fileInfo.getFilePath());
if (!file.exists()) {
throw new FileNotFoundException("文件不存在");
}
if (file.isFile()) {
tree.add(getFileInfo(file, fileInfo));
} else {
File[] files = file.listFiles();
for (File f : files) {
if (f.isDirectory()) {
//获取文件对象
FileInfo info = getFolder(f, fileInfo);
//是否获取子文件列表
if (isChildren) {
List<FileInfo> list = getFileDirectoryTree(FileInfo.builder()
.filePath(fileInfo.getFilePath() + "/" + f.getName())
.fileType(fileInfo.getFileType())
.build(), isFile, isChildren);
info.setChildrenFileList(list);
}
tree.add(info);
} else {
//是否获取文件
if (isFile) {
tree.add(getFileInfo(f, fileInfo));
}
}
}
}
return tree;
}
//设置文件属性列表
private FileInfo getFileInfo(File f, FileInfo fileInfo) {
FileInfo info = getFolder(f, fileInfo);
info.setFileSize(f.length());
info.setUpdateTime(new Date(f.lastModified()));
info.setChildrenFileList(new ArrayList<>());
return info;
}
//获取文件绝对路径
private FileInfo getFolder(File f, FileInfo fileInfo) {
FileInfo info = new FileInfo();
info.setFileName(f.getName());
info.setFilePath(IoUtil.convertLinuxPath(fileInfo.getFilePath() + "/" + f.getName()));
info.setAbsolutePath(IoUtil.convertLinuxPath(f.getAbsolutePath()));
info.setFileType(fileInfo.getFileType());
return info;
}
//获取文件根路径
private String getRootDirectory(Integer fileType) {
String rootDirectory = "";
switch (fileType) {
case FileTypeConstant.FILE_OTHER:
rootDirectory = DocManagerConfig.getUploadPath();
break;
case FileTypeConstant.FILE_TEMPLATE:
rootDirectory = DocManagerConfig.getAvatarPath();
break;
default:
throw new RuntimeException("非法文件类型");
}
return rootDirectory;
}
@Override
public boolean newFolder(FileInfo fileInfo) {
if (fileInfo.getFileType() == FileTypeConstant.ONLINE || fileInfo.getFileType() == FileTypeConstant.FZ) {
return false;
}
String rootDirectory = getRootDirectory(fileInfo.getFileType());
File file = new File(rootDirectory + fileInfo.getFilePath() + File.separator + fileInfo.getFileName());
File faFile = new File(rootDirectory + fileInfo.getFilePath());
if (!faFile.exists()) {
boolean result = faFile.mkdirs();
}
if (!faFile.isDirectory()) {
throw new IllegalArgumentException("该文件不是目录");
}
if (file.exists()) {
throw new IllegalArgumentException("该目录已存在");
} else {
boolean flag = file.mkdir();
return flag;
}
}
@Override
public boolean delFile(FileInfo fileInfo) {
if (fileInfo.getFileType() == FileTypeConstant.ONLINE || fileInfo.getFileType() == FileTypeConstant.FZ) {
return false;
}
String rootDirectory = getRootDirectory(fileInfo.getFileType());
File file = new File(rootDirectory + fileInfo.getFilePath());
if (!file.exists()) {
throw new IllegalArgumentException("不存在该文件");
}
boolean result = true;
if (file.isDirectory()) {
try {
FileUtils.deleteDirectory(file);
} catch (IOException e) {
result = false;
}
} else {
result = file.delete();
}
return result;
}
4.Controller实现
/**
* 返回服务端文件目录结构
*/
@GetMapping("/tree")
public TableDataInfo findFileDirectoryTree(FileInfo fileInfo) {
List<FileInfo> list = null;
try {
list = fileBaseInfoService.getFileDirectoryTree(fileInfo, true, false);
} catch (FileNotFoundException e) {
e.printStackTrace();
return getDataTable(null);
}
//统一返回数据方式
return getDataTable(list);
}
/**
* 新建文件夹
*/
@RequestMapping(value = "newFolder", method = RequestMethod.POST)
@ApiOperation(value = "新建文件夹")
public Response newFolder(FileInfo fileInfo) {
boolean result = service.newFolder(fileInfo);
if (result) {
return Response.getInstance().setOk(200, "", "创建成功", null);
} else {
return Response.getInstance().setError(400, "", "创建失败");
}
}
/**
* 删除文件或文件夹
*/
@RequestMapping(value = "delFile", method = RequestMethod.POST)
@ApiOperation(value = "删除文件或文件夹")
public Response delFile(FileInfo fileInfo) {
boolean result = service.delFile(fileInfo);
if (result) {
return Response.getResultData(200, "删除成功");
} else {
return Response.getResultData(400, "删除失败");
}
}
5.工具类
package cn.piesat.common.utils.file;
import org.apache.commons.io.IOUtils;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.charset.Charset;
/**
* @date 2018-07-17 15:29
* @description IO操作类
*/
public class IoUtil {
private static final org.slf4j.Logger log = LoggerFactory.getLogger(IoUtil.class);
/**
* 将文件读出装入byte数组中
*
* @param path
* @return
*/
public static byte[] toByteArray(String path) {
FileInputStream is = null;
try {
File file = new File(path);
if (file != null && file.exists()) {
is = new FileInputStream(file);
return IOUtils.toByteArray(is);
}
return null;
} catch (IOException e) {
log.error("读取" + path + "文件成byte数组失败", e);
return null;
} finally {
close(is, null);
}
}
/**
* 将输入流读出装入byte数组中
*
* @param inputStream 输入流
* @return
*/
public static byte[] toByteArray(InputStream inputStream) {
try {
return IOUtils.toByteArray(inputStream);
} catch (IOException e) {
log.error("读取输入流成byte数组失败", e);
return null;
}
}
/**
* 将本地文件读成输入流
*
* @param path 本地文件路径
* @param encoding 编码
* @return
*/
public static InputStream toInputStream(String path, String encoding) {
return IOUtils.toInputStream(path, Charset.forName(encoding));
}
/**
* 关闭输入流和输出流
*
* @param is
* @param os
*/
public synchronized static void close(InputStream is, OutputStream os) {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
log.info("关闭读写流失败", e);
}
}
public static String convertLinuxPath(String path) {
String osName = System.getProperty("os.name");
if (!"Linux".equals(osName)) {
if (path.contains(":")) {
path = path.substring(2);
}
// path = StringUtils.replaceAll(path, "\\", "/");
}
return path;
}
}