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

网友投稿 822 2022-11-15

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

自己动手用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 userFileList(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());

// 赋值到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 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;

}

@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 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());

// 赋值到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 fileList = new ArrayList(Arrays.asList(fileArray));

Collections.sort(fileList, new Comparator() {

// 按文件名升序排列

@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;

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C++ 查找 Temp 目录下指定类型文件的 HEX 特征
下一篇:Python 操作 Redis
相关文章

 发表评论

暂时没有评论,来抢沙发吧~