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

项目编号: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.*;

/**
 *指南针毕设
 */
@Service
public 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实现仿百度网盘的实践的文章就介绍到这了,更多相关Springboot仿百度网盘内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot开发案例之打造私有云网盘的实现

    前言 最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意.无意中发现一个很好用的开源web文件管理器插件 elfinder,功能比较完善,社区也很活跃,还方便二次开发. 环境搭建 软件 地址 SpringBoot https://spring.io/projects/spring-boot/ elFinder https://studio-42.github.io/elFinder/ 项目截图 周末抽时间做了一个简单的案例,希望对大家有所帮助,下面是

  • Java+Springboot搭建一个在线网盘文件分享系统

    目录 前言 效果图 主要代码 管理员控制器: 文件仓库控制器: 登录控制器: FTP工具类:  前言 springboot+freemark+jpa+MySQL实现的在线网盘文件分享系统,其功能跟百度网盘非常类似,普通用户可以注册登录,注册后默认分配1G的空间大小,登录进去后可以新建文件夹.上传各种类型的文件.文件移动.复制.下载.删除.分享,分享分为私密分享和公开分享,还可以设置分享过期时间,打开分享链接后可以对文件进行查看.下载.保存到自己网盘等.超级管理员登录后可以设置普通用户的空间大小.

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

    项目编号:BS-PT-032 本项目基于Springboot开发实现,前端采用BootStrap开发实现,系统功能完整,交互性好,模仿百度网盘实现相关功能,比较适合做毕业设计使用,创意性强. 开发工具为IDEA或ECLIPSE,数据库采用MYSQL数据库. 系统部分功能展示如下: http://localhost:8080/toLogin admin / 123456 登陆页面: 主页 对应本地磁盘存储目录: 分享网盘资料 根据提取码下载相关资料 下载 重命名文件或文件夹 文件上传 新建文件夹

  • javascript仿163网盘无刷新文件上传系统

    本来觉得这个系统会很复杂,但把每个部分都分析清楚后,其实需要的技术并不高.不过当我把各个功能函数都整理好准备进行封装时,却发现要把程序封装不是那么容易,因为程序跟html的耦合度太高.然后我逐步把程序中操作html相关的部分分离出来,首先把简单的分离,接着是文件列表,然后是file控件,最后是一些提示性程序.经过几次尝试才把整个结构封装好. 仿163网盘无刷新文件上传系统 .fu_list { width:600px; background:#ebebeb; font-size:12px; }

  • 比较简单的百度网盘文件直链PHP代码

    百度网盘速度快,稳定性好,你值得拥有,如果以后支持直连以后就可以直接使用百度的网盘了. 这里提供的是临时解决方案,不保证以后可以使用 将下面的代码保存为downbd.php 复制代码 代码如下: <?php $canshu=$_SERVER["QUERY_STRING"]; if($canshu=="") { die("文件不存在"); } else { $wangzhi="http://pan.baidu.com/share/l

  • 用php实现百度网盘图片直链的代码分享

    第一种代码:代码量较少通过正则表达式获取百度网盘的文件真实地址,来实现直链的效果 将下面的代码保存为downbd.php 复制代码 代码如下: <?php $canshu=$_SERVER["QUERY_STRING"]; if($canshu=="") { die("文件不存在"); } else { $wangzhi="http://pan.baidu.com/share/link?".$canshu; $file=

  • java获取百度网盘真实下载链接的方法

    本文实例讲述了java获取百度网盘真实下载链接的方法.分享给大家供大家参考.具体如下: 目前还存在一个问题,同一ip在获取3次以后会出现验证码,会获取失败,感兴趣的朋友对此可以加以完善. 返回的List<Map<String, Object>>  中的map包含:fileName( 文件名),url(实链地址) HttpRequest.java如下: import java.io.BufferedReader; import java.io.IOException; import

  • 使用electron实现百度网盘悬浮窗口功能的示例代码

    相关依赖 里面使用了vuex vue vue-route storeJs storeJs 用来持久化vuex状态 展示 介绍说明 没有使用electron内置的-webkit-app-region: drag 因为使用他那个有很多问题 比如事件无法使用 右键无法使用 以及不能使用手型等! 安装 安装的时候没有截图 所以就参考下我其他的文章吧 storeJs 安装 npm install storejs 准备写代码 配置路由文件 export default new Router({ routes

  • Python 一键获取百度网盘提取码的方法

    该 GIF 图来自于官网,文末有给出链接. 描述 依托于百度网盘巨大的的云存储空间,绝大数人会习惯性的将一些资料什么的存储到上面,但是有的私密链接需要提取码,但是让每个想下载私密资源的人记住每一个提取码显然是不现实的.这个时候,云盘万能钥匙 诞生了,我们通过安装相应的浏览器插件就可以自动获获取相应链接的提取码.我在 Github 上看了一下,有 Web JS 版的, python 版的貌似还没有找到,所以我参照了JS 版本和官网的请求接口写了两种方式的获取脚本. 实现 下述两种方式的具体实现就不

  • JS实现百度网盘任意文件强制下载功能

    代码: //get file list data var data=require("system-core:context/context.js").instanceForSystem.getList().listView.listsData; //calculate sign function base64Encode(r){var t,e,a,c,n,o,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012

  • 在win64上使用bypy进行百度网盘文件上传功能

    阿里云服务器的带宽为2M,网站每日的备份包都3G多了,离线下载太费时间了,打算每日将备份包自动上传到自己的百度云盘里.  1.先安装Python 执行python -V ,发现没安装python 2.去python官网去下载 我选的是64位版本的python2.7.17 3.安装python   这个地方必须选一下,加入Path里 安装完毕,执行python -V,显示正确的版本 4.安装pip https://pypi.org/project/pip/#files pip-19.3.1.tar

  • 阿里云盘对比百度网盘优势分析(阿里云盘邀请码、内测码获取方法) 原创

    阿里巴巴开始预告推出阿里云盘以后,很多小伙伴都在关注这个事情,作为一家非常有实力的IT互联网公司,这个重磅产品一定会改变目前市场中网盘的格局,由于更推出,并且注册通过激活码邀请码的方式,很多朋友都没有能够提前体验到这款产品,为了回馈小伙伴对我们的支持,我们通过渠道获取了珍贵的9个激活码,在文末免费分享给大家! 阿里云网盘官网 阿里云盘官网:https://www.aliyundrive.com/ 阿里云官网截图 阿里云盘免费空间多大 1.阿里云网盘app免费的容量空间是1TB,如果是开放会员的话

随机推荐