首页>代码>springboot实现超级好用的windows+Linux可视化文件操作项目>/spring-boot-filemanager/src/main/java/org/shaofan/SpringBootFileManagerApplication.java
package org.shaofan; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.*; import java.net.URLConnection; import java.net.URLEncoder; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.zip.ZipOutputStream; import static org.shaofan.utils.RarUtils.unRarFile; import static org.shaofan.utils.TargzUtils.unTargzFile; import static org.shaofan.utils.ZipUtils.unZipFiles; import static org.shaofan.utils.ZipUtils.zipFiles; /** * @author shaofan */ @SpringBootApplication @RestController @RequestMapping(value = "fileManager") public class SpringBootFileManagerApplication { public static void main(String[] args) { SpringApplication.run(SpringBootFileManagerApplication.class, args); } /** * 文件管理器目录 */ @Value("${filemanager.root}") private String root; /** * 展示文件列表 */ @RequestMapping("list") public Object list(@RequestBody JSONObject json) throws ServletException { try { // 需要显示的目录路径 String path = json.getString("path"); // 返回的结果集 List<JSONObject> fileItems = new ArrayList<>(); try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(root, path))) { String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat dt = new SimpleDateFormat(DATE_FORMAT); for (Path pathObj : directoryStream) { // 获取文件基本属性 BasicFileAttributes attrs = Files.readAttributes(pathObj, BasicFileAttributes.class); // 封装返回JSON数据 JSONObject fileItem = new JSONObject(); fileItem.put("name", pathObj.getFileName().toString()); // windows 下这句话会影响权限导致无法读取文件? 待验证 目前先注释掉 // fileItem.put("rights", org.shaofan.utils.FileUtils.getPermissions(pathObj)); // 文件权限 fileItem.put("date", dt.format(new Date(attrs.lastModifiedTime().toMillis()))); fileItem.put("size", attrs.size()); fileItem.put("type", attrs.isDirectory() ? "dir" : "file"); fileItems.add(fileItem); } } catch (IOException e) { e.printStackTrace(); } JSONObject jsonObject = new JSONObject(); jsonObject.put("result", fileItems); return jsonObject; } catch (Exception e) { return error(e.getMessage()); } } /** * 文件上传 */ @RequestMapping("upload") public Object upload(@RequestParam("destination") String destination, HttpServletRequest request) { try { // Servlet3.0方式上传文件 Collection<Part> parts = request.getParts(); for (Part part : parts) { if (part.getContentType() != null) { // 忽略路径字段,只处理文件类型 String path = root + destination; File f = new File(path, org.shaofan.utils.FileUtils.getFileName(part.getHeader("content-disposition"))); if (!org.shaofan.utils.FileUtils.write(part.getInputStream(), f)) { throw new Exception("文件上传失败"); } } } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 文件下载/预览 */ @RequestMapping("preview") public void preview(HttpServletResponse response, String path) throws IOException { File file = new File(root, path); if (!file.exists()) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource Not Found"); return; } /* * 获取mimeType */ String mimeType = URLConnection.guessContentTypeFromName(file.getName()); if (mimeType == null) { mimeType = "application/octet-stream"; } response.setContentType(mimeType); response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", URLEncoder.encode(file.getName(), "UTF-8"))); response.setContentLength((int) file.length()); try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) { FileCopyUtils.copy(inputStream, response.getOutputStream()); } } /** * 创建目录 */ @RequestMapping("createFolder") public Object createFolder(@RequestBody JSONObject json) { try { String newPath = json.getString("newPath"); File newDir = new File(root + newPath); if (!newDir.mkdir()) { throw new Exception("不能创建目录: " + newPath); } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 修改文件或目录权限 */ @RequestMapping("changePermissions") public Object changePermissions(@RequestBody JSONObject json) { try { String perms = json.getString("perms"); // 权限 boolean recursive = json.getBoolean("recursive"); // 子目录是否生效 JSONArray items = json.getJSONArray("items"); for (int i = 0; i < items.size(); i++) { String path = items.getString(i); File f = new File(root, path); org.shaofan.utils.FileUtils.setPermissions(f, perms, recursive); // 设置权限 } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 复制文件或目录 */ @RequestMapping("copy") public Object copy(@RequestBody JSONObject json, HttpServletRequest request) { try { String newpath = json.getString("newPath"); JSONArray items = json.getJSONArray("items"); for (int i = 0; i < items.size(); i++) { String path = items.getString(i); File srcFile = new File(root, path); File destFile = new File(root + newpath, srcFile.getName()); FileCopyUtils.copy(srcFile, destFile); } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 移动文件或目录 */ @RequestMapping("move") public Object move(@RequestBody JSONObject json) { try { String newpath = json.getString("newPath"); JSONArray items = json.getJSONArray("items"); for (int i = 0; i < items.size(); i++) { String path = items.getString(i); File srcFile = new File(root, path); File destFile = new File(root + newpath, srcFile.getName()); if (srcFile.isFile()) { FileUtils.moveFile(srcFile, destFile); } else { FileUtils.moveDirectory(srcFile, destFile); } } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 删除文件或目录 */ @RequestMapping("remove") public Object remove(@RequestBody JSONObject json) { try { JSONArray items = json.getJSONArray("items"); for (int i = 0; i < items.size(); i++) { String path = items.getString(i); File srcFile = new File(root, path); if (!FileUtils.deleteQuietly(srcFile)) { throw new Exception("删除失败: " + srcFile.getAbsolutePath()); } } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 重命名文件或目录 */ @RequestMapping("rename") public Object rename(@RequestBody JSONObject json) { try { String path = json.getString("item"); String newPath = json.getString("newItemPath"); File srcFile = new File(root, path); File destFile = new File(root, newPath); if (srcFile.isFile()) { FileUtils.moveFile(srcFile, destFile); } else { FileUtils.moveDirectory(srcFile, destFile); } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 查看文件内容,针对html、txt等可编辑文件 */ @RequestMapping("getContent") public Object getContent(@RequestBody JSONObject json) { try { String path = json.getString("item"); File srcFile = new File(root, path); String content = FileUtils.readFileToString(srcFile); JSONObject jsonObject = new JSONObject(); jsonObject.put("result", content); return jsonObject; } catch (Exception e) { return error(e.getMessage()); } } /** * 修改文件内容,针对html、txt等可编辑文件 */ @RequestMapping("edit") public Object edit(@RequestBody JSONObject json) { try { String path = json.getString("item"); String content = json.getString("content"); File srcFile = new File(root, path); FileUtils.writeStringToFile(srcFile, content); return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 文件压缩 */ @RequestMapping("compress") public Object compress(@RequestBody JSONObject json) { try { String destination = json.getString("destination"); String compressedFilename = json.getString("compressedFilename"); JSONArray items = json.getJSONArray("items"); List<File> files = new ArrayList<>(); for (int i = 0; i < items.size(); i++) { File f = new File(root, items.getString(i)); files.add(f); } File zip = new File(root + destination, compressedFilename); try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zip))) { zipFiles(out, "", files.toArray(new File[files.size()])); } return success(); } catch (Exception e) { return error(e.getMessage()); } } /** * 文件解压 */ @RequestMapping("extract") public Object extract(@RequestBody JSONObject json) { try { String destination = json.getString("destination"); String zipName = json.getString("item"); String folderName = json.getString("folderName"); File file = new File(root, zipName); String extension = org.shaofan.utils.FileUtils.getExtension(zipName); switch (extension) { case ".zip": unZipFiles(file, root + destination); break; case ".gz": unTargzFile(file, root + destination); break; case ".rar": unRarFile(file, root + destination); } return success(); } catch (Exception e) { return error(e.getMessage()); } } private JSONObject error(String msg) { // { "result": { "success": false, "error": "msg" } } JSONObject result = new JSONObject(); result.put("success", false); result.put("error", msg); JSONObject jsonObject = new JSONObject(); jsonObject.put("result", result); return jsonObject; } private JSONObject success() { // { "result": { "success": true, "error": null } } JSONObject result = new JSONObject(); result.put("success", true); result.put("error", null); JSONObject jsonObject = new JSONObject(); jsonObject.put("result", result); return jsonObject; } }
最近下载更多