自己动手用Springboot实现仿百度网盘的实践
项目编号:BS-PT-032
本项目基于Springboot开发实现,前端采用BootStrap开发实现,系统功能完整,交互性好,模仿百度网盘实现相关功能,比较适合做毕业设计使用,创意性强。
开发工具为IDEA或ECLIPSE,数据库采用MYSQL数据库。
系统部分功能展示如下:
http://localhost:8080/toLogin admin / 123456
登陆页面:
文章图片
主页
文章图片
对应本地磁盘存储目录:
文章图片
分享网盘资料
文章图片
根据提取码下载相关资料
【自己动手用Springboot实现仿百度网盘的实践】
文章图片
下载
文章图片
重命名文件或文件夹
文章图片
文件上传
文章图片
新建文件夹
文章图片
上传音乐文件后可以一键自动播放
文章图片
以上是本系统的部分展示功能,可以做为毕业设计使用。
部分代码实现如下:
package com.bjpowernode.pan.service.impl; import com.bjpowernode.pan.dao.model.LinkSecret; import com.bjpowernode.pan.model.FileMsg; import com.bjpowernode.pan.service.IFileService; import com.bjpowernode.pan.util.*; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; import java.util.*; /** *指南针毕设 */@Servicepublic class FileServiceImpl implements IFileService {public static String fileRootPath; public static String tempPath; //分块文件临时存储地址 // 自定义密钥static private String key; @AutowiredSaveServiceImpl saveService; @AutowiredLinkSecretServiceImpl linkSecretService; private Logger logger = LoggerFactory.getLogger(this.getClass()); @Value("${tempPath}")public void setTempPath(String tempPath) {FileServiceImpl.tempPath = tempPath; } @Value("${fileRootPath}")public void setFileRootPath(String fileRootPath) {FileServiceImpl.fileRootPath = fileRootPath; } @Value("${key}")public void setKey(String key) {FileServiceImpl.key = key; } @Overridepublic boolean upload(MultipartFile file, String userName, String path) {boolean b = false; // 服务器上传的文件所在路径String saveFilePath = fileRootPath + userName + "/" + path; logger.warn("1 saveFilePath:" + saveFilePath); // 判断文件夹是否存在-建立文件夹File filePathDir = new File(saveFilePath); if (!filePathDir.exists()) {filePathDir.mkdir(); }// 获取上传文件的原名 例464e7a80_710229096@qq.com.zipString saveFileName = file.getOriginalFilename(); // 上传文件到-磁盘try {FileUtils.copyInputStreamToFile(file.getInputStream(), new File(saveFilePath, saveFileName)); b = true; } catch (Exception e) {logger.error("Exception:", e); return false; }return b; } @Overridepublic String download(String fileName, String userName, String path) {// 服务器下载的文件所在的本地路径的文件夹String saveFilePath = fileRootPath + userName + "/" + path; logger.warn("1 saveFilePath:" + saveFilePath); // 判断文件夹是否存在-建立文件夹File filePathDir = new File(saveFilePath); if (!filePathDir.exists()) {filePathDir.mkdir(); }// 本地路径saveFilePath = saveFilePath + "/" + fileName; String link = saveFilePath.replace(fileRootPath, "/data/"); link = StringUtil.stringSlashToOne(link); logger.warn("返回的路径:" + link); return link; } @Overridepublic ListuserFileList(String userName, String path) {logger.warn("执行userFileList函数!"); List fileMsgList = new ArrayList<>(); // 拉取文件列表-本地磁盘String webSaveFilePath = fileRootPath + userName + "/" + path; File files = new File(webSaveFilePath); if (!files.exists()) {return fileMsgList; }File[] tempList = files.listFiles(); if (tempList == null) {return fileMsgList; }for (File file : tempList) {if (file.isFile()) {FileMsg fileMsg = new FileMsg(); // 获取文件名和下载地址String link = file.toString().replace("\\", "/"); String[] nameArr = link.split("/"); String name = nameArr[nameArr.length - 1]; link = link.replace(fileRootPath, "/data/"); link = link.replace("/root/pan/", "/data/"); String size = FileUtil.fileSizeToString(file.length()); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String lastModTime = formatter.format(file.lastModified()); // 赋值到jsonfileMsg.setName(name); fileMsg.setLink(link); fileMsg.setSize(size); fileMsg.setTime(lastModTime); if (FileUtil.isMp4(name)) {fileMsg.setType("mp4"); } else if (FileUtil.isVideo(name)) {fileMsg.setType("video"); } else {fileMsg.setType("file"); }fileMsgList.add(fileMsg); } else {FileMsg fileMsg = new FileMsg(); String link = file.toString().replace("\\", "/"); String[] nameArr = link.split("/"); String name = nameArr[nameArr.length - 1]; String dirPath = link.replace(fileRootPath + userName, ""); if (!name.equals("userIcon")) {fileMsg.setName(name); fileMsg.setSize("Directory"); fileMsg.setType("dir"); fileMsg.setLink(dirPath); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String lastModTime = formatter.format(file.lastModified()); fileMsg.setTime(lastModTime); fileMsgList.add(fileMsg); }}}//排序ListUtil.listSort(fileMsgList); return fileMsgList; } /*** 展示path目录下的全部文件信息** @param path 文件完全路径* @param userName 用户名* @return FileMsg List*/@Overridepublic List list(String path, String userName) {List fileMsgList = new ArrayList<>(); File files = new File(path); if (!files.exists()) {return fileMsgList; }File[] tempList = files.listFiles(); if (tempList == null) {return fileMsgList; }// 遍历每个文件转json对象for (File file : tempList) {fileMsgList.add(FileUtil.fileToFileMsg(file, userName, fileRootPath, "/data/")); }// 排序规则:文件夹在前,文件在后,更新时间最近的在前ListUtil.listSort(fileMsgList); return fileMsgList; } @Overridepublic Boolean[] userFileDelete(String fileName, String userName, String path) {//解析fileName: 以$$符号分割String[] fileNames = null; if (fileName.contains("$$")) {fileNames = fileName.split("\\$\\$"); } else {fileNames = new String[1]; fileNames[0] = fileName; }Boolean[] b = new Boolean[fileNames.length]; for (int i = 0; i < fileNames.length; i++) {// 删除-本地文件String saveFilePath = fileRootPath + userName + "/" + path; File file = new File(saveFilePath); File[] listFiles = file.listFiles(); boolean b1 = false; //判断是否是文件夹if (fileName.equals("@dir@")) {//是文件夹b1 = FileUtil.delete(saveFilePath); } else {b1 = FileUtil.delete(saveFilePath + "/" + fileNames[i]); } //if (!b1){//FileSave fileSave=saveService.findFileSaveByUserNameAndFileName(userName,//fileNames[i]); //saveService.delete(fileSave); //b1=true; //}b[i] = b1; }return b; } @Overridepublic boolean userFileRename(String oldName, String newName, String userName, String path) {// 重命名-本地磁盘文件String oldNameWithPath; String newNameWithPath; if ("@dir@".equals(oldName)) {oldNameWithPath = StringUtil.stringSlashToOne(fileRootPath + userName + "/" + path); newNameWithPath =oldNameWithPath.substring(0, (int) StringUtil.getfilesuffix(oldNameWithPath, true, "/")) + "/" + newName; newNameWithPath = StringUtil.stringSlashToOne(newNameWithPath); } else {oldNameWithPath = StringUtil.stringSlashToOne(fileRootPath + userName + "/" + path + "/" + oldName); newNameWithPath = StringUtil.stringSlashToOne(fileRootPath + userName + "/" + path + "/" + newName); }return FileUtil.renameFile(oldNameWithPath, newNameWithPath); } @Overridepublic boolean userDirCreate(String dirName, String path) {File file = new File(path + "/" + dirName); return file.mkdir(); } @Overridepublic String fileShareCodeEncode(String filePathAndName) {EncryptUtil des; try {des = new EncryptUtil(key, "utf-8"); return des.encode(filePathAndName); } catch (Exception e) {logger.error("Exception:", e); }return "null"; } @Overridepublic String fileShareCodeDecode(String code) {EncryptUtil des; try {des = new EncryptUtil(key, "utf-8"); logger.warn("00 code:" + code); String filePathAndName = des.decode(code); logger.warn("00 filePathAndName:" + filePathAndName); String[] arr = filePathAndName.split("/"); LinkSecret linkSecret = linkSecretService.findLinkSecretBysecretLink(code); String[] localLink = linkSecret.getLocalLink().split("/"); String userName = localLink[3]; //String userName = arr[0]; String fileName = arr[arr.length - 1]; arr[arr.length - 1] = ""; //String path = StringUtils.join(arr, "/"); String path = userName + "/"; if (localLink.length > 5) {for (int k = 4; k < localLink.length - 1; k++) {path = path + localLink[k] + "/"; }}logger.warn("0 userName:" + userName); logger.warn("1 filePathAndName:" + filePathAndName); logger.warn("2 fileName:" + fileName); logger.warn("3 path:" + path); // 服务器下载的文件所在的本地路径的文件夹String saveFilePath = fileRootPath + "share" + "/" + path; //String saveFilePath = fileRootPath + "/" + path; logger.warn("1 saveFilePath:" + saveFilePath); // 判断文件夹是否存在-建立文件夹File filePathDir = new File(saveFilePath); if (!filePathDir.exists()) {// mkdirs递归创建父目录boolean b = filePathDir.mkdirs(); logger.warn("递归创建父目录:" + b); }saveFilePath = fileRootPath + "/" + path + "/" + fileName; String link = saveFilePath.replace(fileRootPath, "/data/"); link = StringUtil.stringSlashToOne(link); logger.warn("4 link:" + link); // 返回下载路径return link; } catch (Exception e) {logger.error("Exception:", e); return "null"; }} @Overridepublic boolean userFileDirMove(String fileName, String oldPath, String newPath, String userName) {// 移动-本地磁盘文件String saveFilePath = fileRootPath + userName + "/"; String lfilename = ("@dir@".equals(fileName) ? "" : "/" + fileName); String oldNameWithPath = StringUtil.stringSlashToOne(saveFilePath + oldPath + lfilename); String tmpnewfilename = "@dir@".equals(fileName) ?(String) StringUtil.getfilesuffix(oldNameWithPath, false, "/", false) : ""; String newNameWithPath = StringUtil.stringSlashToOne(saveFilePath + newPath + lfilename + tmpnewfilename); return FileUtil.renameFile(oldNameWithPath, newNameWithPath); } @Overridepublic List search(String key, String userName, String path) {List fileMsgList = new ArrayList<>(); // 拉取文件列表-本地磁盘String webSaveFilePath = fileRootPath + userName + "/" + path; File files = new File(webSaveFilePath); if (!files.exists()) {files.mkdir(); }//File[] tempList = files.listFiles(); List tempList = new ArrayList<>(); tempList = SearchFileByKey.searchFile(webSaveFilePath, key, false, tempList); for (int i = 0; i < tempList.size(); i++) {if (tempList.get(i).isFile()) {//logger.warn("用户:" + userName + " 文件:" + tempList[i]); FileMsg fileMsg = new FileMsg(); // 获取文件名和下载地址String link = tempList.get(i).toString().replace("\\", "/"); String[] nameArr = link.split("/"); String name = nameArr[nameArr.length - 1]; link = link.replace(fileRootPath, "/data/"); link = link.replace("/root/pan/", "/data/"); String size = FileUtil.fileSizeToString(tempList.get(i).length()); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String lastModTime = formatter.format(tempList.get(i).lastModified()); // 赋值到jsonfileMsg.setName(name); fileMsg.setLink(link); fileMsg.setSize(size); fileMsg.setTime(lastModTime); fileMsgList.add(fileMsg); } else {FileMsg fileMsg = new FileMsg(); String link = tempList.get(i).toString().replace("\\", "/"); String[] nameArr = link.split("/"); String name = nameArr[nameArr.length - 1]; if (!name.equals("userIcon")) {fileMsg.setLink(link); fileMsg.setName(name); fileMsg.setSize("Directory"); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String lastModTime = formatter.format(tempList.get(i).lastModified()); fileMsg.setTime(lastModTime); fileMsgList.add(fileMsg); }}}return fileMsgList; } @Overridepublic boolean merge(String fileName, String userName, String path) throws InterruptedException {boolean b = false; String savePath = fileRootPath + userName + "/" + path; File saveDir = new File(savePath); if (!saveDir.exists()) {saveDir.mkdirs(); }String tempDirPath = FileUtil.getTempDir(tempPath, userName, fileName); File tempDir = new File(tempDirPath); // 获得分片文件列表File[] fileArray = tempDir.listFiles(new FileFilter() {// 只需要文件@Overridepublic boolean accept(File pathname) {if (pathname.isDirectory()) {return false; } else {return true; }}}); //logger.warn("【要合成的文件有】:"+fileArray); //while (fileArray==null){//}// 转成集合进行排序后合并文件List fileList = new ArrayList (Arrays.asList(fileArray)); Collections.sort(fileList, new Comparator () {// 按文件名升序排列@Overridepublic int compare(File o1, File o2) {if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {return -1; } else {return 1; }}}); // 目标文件File outfile = new File(savePath + File.separator + fileName); try {outfile.createNewFile(); } catch (IOException e) {b = false; logger.warn("创建目标文件出错:" + e.getMessage()); logger.error("Exception:", e); } // 执行合并操作FileChannel outChannel = null; FileChannel inChannel; try {outChannel = new FileOutputStream(outfile).getChannel(); for (File file1 : fileList) {inChannel = new FileInputStream(file1).getChannel(); inChannel.transferTo(0, inChannel.size(), outChannel); inChannel.close(); file1.delete(); }outChannel.close(); } catch (FileNotFoundException e) {b = false; logger.warn("合并分片文件出错:" + e.getMessage()); logger.error("Exception:", e); } catch (IOException e) {b = false; logger.warn("合并分片文件出错:" + e.getMessage()); logger.error("Exception:", e); } // 删除临时文件夹 根目录/temp/userName/fileNameFile tempFileDir = new File(tempPath + File.separator + userName + File.separator + fileName); FileUtil.deleteDir(tempFileDir); return b; } //locallink是原始文件路径,path:存取路径@Overridepublic boolean copyFileToMyPan(String userName, String localLink, String path) {boolean b = false; //share文件所在的地方logger.warn("0 localLink:" + localLink); localLink = localLink.replace("/data/", fileRootPath); logger.warn("0.1 localLink2:" + localLink); File oldfile = new File(localLink); String[] msg = localLink.split("/"); String saveFileName = oldfile.getName(); String saveFilePath = fileRootPath + userName + "/" + path; logger.warn("0.2 saveFilePath:" + saveFilePath); File newfileDir = new File(saveFilePath); if (!newfileDir.exists()) {newfileDir.mkdir(); }try {if (oldfile.exists()) {FileUtils.copyInputStreamToFile(new FileInputStream(oldfile), new File(saveFilePath, saveFileName)); b = true; } else {//TODOlogger.warn("存在同名文件"); b = false; }} catch (IOException e) { logger.error("Exception:", e); return false; }logger.warn("copyFileToMyPan() result:{}", b); return b; }}
到此这篇关于自己动手用Springboot实现仿百度网盘的实践的文章就介绍到这了,更多相关Springboot仿百度网盘内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 软件测试|让你提高百倍效率、史上最强的「自动化测试」学习路线在这里···
- nginx|Nginx+Tomcat负载均衡,动静分离群集
- docker|自动化运维之docker上——docker简介、docker的安装、docker镜像
- 软件测试|自动化测试平台设计开发经验
- 软件测试|手把手教你设计接口自动化测试用例(根据接口信息设计测试用例)
- 华为认证|HCIA- Datacom认证增加了SDN跟自动化编程
- 水母的世界
- 音乐学科教学交流研讨活动学习心得体会
- 安住内心|安住内心 由心而动
- 静不下心学习却还要强迫自己学习时怎么办