欢迎光临散文网 会员登陆 & 注册

自己动手用Springboot实现仿百度网盘

2022-03-07 09:38 作者:指南针毕业设计  | 我要投稿

 项目编号:BS-PT-032

 

本项目基于Springboot开发实现,前端采用BootStrap开发实现,系统功能完整,交互性好,模仿百度网盘实现相关功能,比较适合做毕业设计使用,创意性强。

开发工具为IDEA或ECLIPSE,数据库采用MYSQL数据库。

系统部分功能展示如下:

http://localhost:8080/toLogin      admin  /  123456

登陆页面:


主页


对应本地磁盘存储目录:


分享网盘资料


根据提取码下载相关资料


下载


重命名文件或文件夹


文件上传


新建文件夹


上传音乐文件后可以一键自动播放


以上是本系统的部分展示功能,可以做为毕业设计使用。

部分代码实现如下:

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;    @Autowired    SaveServiceImpl saveService;    @Autowired    LinkSecretServiceImpl 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;    }    @Override    public 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.zip        String 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;    }    @Override    public 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;    }    @Override    public List<FileMsg> userFileList(String userName, String path) {        logger.warn("执行userFileList函数!");        List<FileMsg> 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());                // 赋值到json                fileMsg.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     */    @Override    public List<FileMsg> list(String path, String userName) {        List<FileMsg> 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;    }    @Override    public 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;    }    @Override    public 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);    }    @Override    public boolean userDirCreate(String dirName, String path) {        File file = new File(path + "/" + dirName);        return file.mkdir();    }    @Override    public 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";    }    @Override    public 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";        }    }    @Override    public 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);    }    @Override    public List<FileMsg> search(String key, String userName, String path) {        List<FileMsg> fileMsgList = new ArrayList<>();        // 拉取文件列表-本地磁盘        String webSaveFilePath = fileRootPath + userName + "/" + path;        File files = new File(webSaveFilePath);        if (!files.exists()) {            files.mkdir();        }        //            File[] tempList = files.listFiles();        List<File> 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());                // 赋值到json                fileMsg.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;    }    @Override    public 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() {            // 只需要文件            @Override            public boolean accept(File pathname) {                if (pathname.isDirectory()) {                    return false;                } else {                    return true;                }            }        });        //        logger.warn("【要合成的文件有】:"+fileArray);        //       while (fileArray==null){        //       }        // 转成集合进行排序后合并文件        List<File> fileList = new ArrayList<File>(Arrays.asList(fileArray));        Collections.sort(fileList, new Comparator<File>() {            // 按文件名升序排列            @Override            public 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/fileName        File tempFileDir = new File(tempPath + File.separator + userName + File.separator + fileName);        FileUtil.deleteDir(tempFileDir);        return b;    }    //locallink是原始文件路径,path:存取路径    @Override    public 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 {                //TODO                logger.warn("存在同名文件");                b = false;            }        } catch (IOException e) {            logger.error("Exception:", e);            return false;        }        logger.warn("copyFileToMyPan() result:{}", b);        return b;    } }



自己动手用Springboot实现仿百度网盘的评论 (共 条)

分享到微博请遵守国家法律